BigDecimal减法
我想减去2个double
值,我尝试了以下代码。
double val1 = 2.0; double val2 = 1.10; System.out.println(val1 - val2);
我得到了输出,
0.8999999999999999
为了获得输出为0.9
我尝试使用BigDecimal
如下,
BigDecimal val1BD = new BigDecimal(val1); BigDecimal val2BD = new BigDecimal(val2); System.out.println(val1BD.subtract(val2BD));
我得到了输出,
0.899999999999999911182158029987476766109466552734375
然后我尝试使用BigDecimal.valueOf()
val1BD = BigDecimal.valueOf(val1); val2BD = BigDecimal.valueOf(val2); System.out.println(val1BD.subtract(val2BD));
最后我得到了0.9
的输出。
我的问题是案例2和案例3有什么区别?
在案例2中为什么我得到这样的输出?
BigDecimal.valueOf(double d)
使用double值的规范String
表示,在内部使用Double.toString(double)
,这就是你在第二种情况下获得0.9
的原因。
注意:这通常是将double(或float)转换为BigDecimal的首选方法,因为返回的值等于从使用
Double.toString(double)
的结果构造BigDecimal所产生的Double.toString(double)
。
使用new BigDecimal(0.9)
它会将值转换为double
值的精确浮点表示,而不使用String
表示,
将double转换为
BigDecimal
,它是double的二进制浮点值的精确十进制表示forms。…
注意:
- 这个构造函数的结果可能有点不可预测。
…
例如 :
BigDecimal bd1 = new BigDecimal(Double.toString(0.9)); BigDecimal bd2 = new BigDecimal(0.9); System.out.println(bd1); System.out.println(bd2);
输出:
0.9 0.90000000000000002220446049250313080847263336181640625