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。

注意:

  1. 这个构造函数的结果可能有点不可预测。

例如 :

 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