Java中BigDecimal的加减乘除、比较大小与使用注意事项
前言
借用《effactive java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了bigdecimal ,关于bigdecimal 的介绍有很多,需要了解的朋友可以参考这篇文章:
一、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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
Java中BigDecimal的加减乘除、比较大小与使用注意事项
-
Java中long类型与Long类型的区别和大小比较详解
-
JavaEE基础day02 1.定义Java中的变量 四类八种 2.变量定义和使用的注意事项 3.数据类型的转换、强制数据类型转换4.算数运算符、比较运算符、逻辑运算符、赋值运算符、三元运算符
-
Java中BigDecimal的加减乘除、比较大小与使用注意事项
-
Java中stream处理中map与flatMap的比较和使用案例
-
Java中数组的使用与注意事项详解(推荐)
-
Java中Process类的使用与注意事项说明
-
Java中stream处理中map与flatMap的比较和使用案例
-
Java中数组的使用与注意事项详解(推荐)
-
Java中Process类的使用与注意事项说明