前言:
目前姐妹们对“decimaljava”都比较看重,同学们都想要剖析一些“decimaljava”的相关资讯。那么小编在网上汇集了一些有关“decimaljava””的相关知识,希望你们能喜欢,你们一起来学习一下吧!BigDecimal类
对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。
上述代码输出结果:
0.1000000000000000055511151231257827021181583404541015625
0.1
分析过程
BigDecimal a = new BigDecimal(0.1);
上述代码说明:事实上,由于二进制无法精确地表示十进制小数0.1,但是编译器读到 0.1之后,必须把它转成8个字节的double值,因此,编译器只能用一个最接近的值来代替0.1了,即0.1000000000000000055511151231257827021181583404541015625。因此,在运行时,传给BigDecimal构造函数的真正的数值是0.1000000000000000055511151231257827021181583404541015625。
如果你希望BigDecimal能够精确地表示你希望的数值,那么一定要使用字符串来表示小数,并传递给BigDecimal的构造函数。
总结一下
1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入new BigDecimal(0.1)所创建的BigDecimal正好等于 0.1,但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
2、另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。
进一步延伸
下面这段代码的输出值:
BigDecimal a1 = new BigDecimal("1.0");
BigDecimal a2 = new BigDecimal("0.9");
BigDecimal a3 = new BigDecimal("0.8");
if(a1.subtract(a2).equals(a2.subtract(a3))) {
System.out.println("true");
} else {
System.out.println("flase");
}
输出结果:true
完整代码如下所示:
对代码做一下调整,传入double 类型参数,看看输出结果:
标签: #decimaljava