首页 > 编程知识 正文

判断bigdecimal是否为空,bigdecimal判断相等

时间:2023-05-03 19:21:12 阅读:50815 作者:3308

在Java中,CPU本机提供的最大整数范围是64位长整数。 使用long型整数,可以通过CPU指令直接计算,所以速度非常快。

如果使用的整数范围超过long型怎么办? 此时,只能使用软件模拟大整数。 java.math.BigInteger是表示任意大小的整数。 在BigInteger内部,使用int[]数组模拟非常大的整数。

bigintegerbi=newbiginteger (1234567890 );

system.out.println(bi.pow ) ) 5; //28679718602997181072337614380936720482949000

运算BigInteger时,只能使用实例方法。 例如,加法运算:

bigintegeri1=newbiginteger (1234567890 );

bigintegeri2=newbiginteger (12345678901234567890 );

bigintegersum=I1.add(I2; //12345678902469135780

与long型整数运算相比,BigInteger没有范围限制,但存在速度慢的缺点。

也可以将BigInteger转换为长整型:

bigintegeri=newbiginteger (123456789000 );

system.out.println(I.longvalue ) ); //123456789000

system.out.println (I.multiply (I ).longValueExact ) ); //Java.lang.arithmetic exception : bigintegeroutoflongrange

使用longValueExact ()方法时,如果超出long类型的范围,则会抛出ArithmeticException。

BigInteger和Integer、Long一样,是不变系数,也从Number系数继承。 因为Number定义了几种转换为基本类型的方法。

byte :转换为byte value

短时间:转换为短时间值

int:intValue (转换为

长:转换为长值

浮动:转换为浮动值()

double :转换为doublevalue

因而,通过上述的方法,能够将BigInteger变换为基本类型。 如果BigInteger表示的范围超出基本类型的范围,则在转换时会丢失更高的信息。 也就是说,结果不一定准确。 如果需要准确转换为基本类型,请使用intValueExact ()、longValueExact () )等方法。 如果转换时超出范围,则会直接抛出ArithmeticException异常。

如果BigInteger的值超出了浮点的最大范围,返回的浮点是什么?

//BigInteger to float

import java.math.BigInteger;

公共类主{

publicstaticvoidmain (字符串[ ] args ) {

bigintegern=newbiginteger (' 999999 ' ).pow );

float f=n.floatValue (;

系统. out.println (f;

}

}

//Infinity

总结

BigInteger用于表示任意大小的整数;

BigInteger是一个不变的类,从Number继承;

将BigInteger转换为基本类型时,可以使用longValueExact ()等方法确保结果正确。

二进制文件

与BigInteger一样,BigDecimal可以表示任意大小的完全准确的浮点数。

bigdecimal BD=new bigdecimal (' 123.4567 );

system.out.println(BD.multiply ) BD ); //15241.55677489

BigDecimal用scale (表示小数点后的位数。 示例:

bigdecimal D1=new bigdecimal (' 123.45 );

bigdecimal D2=new bigdecimal (' 123.4500 );

bigdecimal D3=new bigdecimal (1234500 );

system.out.println(D1.scale ) ); //2,小数2位

system.out.println(D2.scale ) ); //4

System.out.println(d3.scale()); // 0

通过BigDecimal的stripTrailingZeros()方法,可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal:

BigDecimal d1 = new BigDecimal("123.4500");

BigDecimal d2 = d1.stripTrailingZeros();

System.out.println(d1.scale()); // 4

System.out.println(d2.scale()); // 2,因为去掉了00

BigDecimal d3 = new BigDecimal("1234500");

BigDecimal d4 = d3.stripTrailingZeros();

System.out.println(d3.scale()); // 0

System.out.println(d4.scale()); // -2

如果一个BigDecimal的scale()返回负数,例如,-2,表示这个数是个整数,并且末尾有2个0。

可以对一个BigDecimal设置它的scale,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断:

import java.math.BigDecimal;

import java.math.RoundingMode;

public class Main {

public static void main(String[] args) {

BigDecimal d1 = new BigDecimal("123.456789");

BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入,123.4568

BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN); // 直接截断,123.4567

System.out.println(d2);

System.out.println(d3);

}

}

对BigDecimal做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断:

BigDecimal d1 = new BigDecimal("123.456");

BigDecimal d2 = new BigDecimal("23.456789");

BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); // 保留10位小数并四舍五入

BigDecimal d4 = d1.divide(d2); // 报错:ArithmeticException,因为除不尽

还可以对BigDecimal做除法的同时求余数:

import java.math.BigDecimal;

public class Main {

public static void main(String[] args) {

BigDecimal n = new BigDecimal("12.345");

BigDecimal m = new BigDecimal("0.12");

BigDecimal[] dr = n.divideAndRemainder(m);

System.out.println(dr[0]); // 102

System.out.println(dr[1]); // 0.105

}

}

调用divideAndRemainder()方法时,返回的数组包含两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数。我们可以利用这个方法判断两个BigDecimal是否是整数倍数:

BigDecimal n = new BigDecimal("12.75");

BigDecimal m = new BigDecimal("0.15");

BigDecimal[] dr = n.divideAndRemainder(m);

if (dr[1].signum() == 0) {

// n是m的整数倍

}

比较BigDecimal

在比较两个BigDecimal的值是否相等时,要特别注意,使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等:

BigDecimal d1 = new BigDecimal("123.456");

BigDecimal d2 = new BigDecimal("123.45600");

System.out.println(d1.equals(d2)); // false,因为scale不同

System.out.println(d1.equals(d2.stripTrailingZeros())); // true,因为d2去除尾部0后scale变为2

System.out.println(d1.compareTo(d2)); // 0

必须使用compareTo()方法来比较,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。

总是使用compareTo()比较两个BigDecimal的值,不要使用equals()!

如果查看BigDecimal的源码,可以发现,实际上一个BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数:

public class BigDecimal extends Number implements Comparable {

private final BigInteger intVal;

private final int scale;

}

BigDecimal也是从Number继承的,也是不可变对象。

小结

BigDecimal用于表示精确的小数,常用于财务计算;

比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals()。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。