您的位置:首页 > 编程语言 > Java开发

Java中BigDecimal的加减乘除、比较大小与使用注意事项

2017-11-14 09:27 941 查看

前言

借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了BigDecimal ,关于BigDecimal 的介绍有很多,需要了解的朋友可以参考这篇文章:https://www.jb51.nethttps://www.geek-share.com/detail/2622099765.html

一、BigDecimal 的加减乘除

BigDecimal bignum1 = new BigDecimal("10");
BigDecimal bignum2 = new BigDecimal("5");
BigDecimal bignum3 = null;
//加法
bignum3 = bignum1.add(bignum2);
System.out.println("和 是:" + bignum3);
//减法
bignum3 = bignum1.subtract(bignum2);
System.out.println("差 是:" + bignum3);
//乘法
bignum3 = bignum1.multiply(bignum2);
System.out.println("积 是:" + bignum3);
//除法
bignum3 = bignum1.divide(bignum2);
System.out.println("商 是:" + bignum3);

运行结果为:


二、BigDecimal 的比较大小。

BigDecimal num1 = new BigDecimal("0");
BigDecimal num2 = new BigDecimal("1");
BigDecimal num3 = new BigDecimal("2");
BigDecimal num = new BigDecimal("1"); //用做比较的值
System.out.println(num1.compareTo(num)); //小于 时,返回 -1
System.out.println(num2.compareTo(num)); //等于 时,返回 0
System.out.println(num3.compareTo(num)); //大于 时,返回 1

这是输出结果:

解释下注释里面了。

补充:

BigInteger 也可以存放比较大的数, 和 BigDecimal 的区别是 :BigInteger 存放的是大的整数,而BigDecimal 存放大的小数

继续补充一下,用BigDecimal 写个for循环。

for (BigDecimal i = new BigDecimal("0"); i.compareTo(new BigDecimal("10")) != 1; i = i.add(new BigDecimal("1"))) {
System.out.print(i + "\t");
}

控制台打印的是从0 到 10 。

三、Java中的BigDecimal使用注意事项

1.BigDecial是immutable的,就像String一样,它的所有操作都会生成一个新的对象,所以

amount.add( thisAmount );

是错误的;而应该是:

amount = amount.add( thisAmount );

2. 不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;

例如:

BigDecimal a = new BigDecimal("2.00");
BigDecimal b = new BigDecimal("2.0");
print(a.equals(b)); // false

所以你应该使用compareTo()和signum()方法

a.compareTo(b); // returns (-1 if a < b), (0 if a == b), (1 if a > b)
a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)

3. 使用BigDecimal的字符串构造函数,不要使用double参数的构造函数,否则的话会出现你不想要的结果。

例如下面的代码分别使用double和String的构造函数,然后使用HALF_EVEN的round方法,但是输出结果不一样:

System.out.println("==================");
for(int i = 0; i < 10; i ++) {
StringBuffer sb = new StringBuffer();
sb.append("0.");
sb.append(i);
sb.append("5");
BigDecimal bdx = new BigDecimal(sb.toString());
System.out.println(sb + " " +bdx.setScale(1, RoundingMode.HALF_EVEN));
}
System.out.println("==================");
for(int i = 0; i < 10; i ++) {
StringBuffer sb = new StringBuffer();
sb.append("0.");
sb.append(i);
sb.append("5");
BigDecimal bdx = new BigDecimal(Double.valueOf(sb.toString()));
System.out.println(sb + " " +bdx.setScale(1, RoundingMode.HALF_EVEN));
}

输出是:

==================
0.05 0.0
0.15 0.2
0.25 0.2
0.35 0.4
0.45 0.4
0.55 0.6
0.65 0.6
0.75 0.8
0.85 0.8
0.95 1.0
==================
0.05 0.1
0.15 0.1
0.25 0.2
0.35 0.3
0.45 0.5
0.55 0.6
0.65 0.7
0.75 0.8
0.85 0.8
0.95 0.9

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息