BigDecimal减法

Rak*_* KR 8 java bigdecimal

我想减去2个double值,我尝试了以下代码.

double val1 = 2.0;
double val2 = 1.10;

System.out.println(val1 - val2);
Run Code Online (Sandbox Code Playgroud)

我得到了输出,

0.8999999999999999
Run Code Online (Sandbox Code Playgroud)

为了获得输出,0.9我尝试BigDecimal如下,

BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);

System.out.println(val1BD.subtract(val2BD));
Run Code Online (Sandbox Code Playgroud)

我得到了输出,

0.899999999999999911182158029987476766109466552734375
Run Code Online (Sandbox Code Playgroud)

然后我尝试了 BigDecimal.valueOf()

val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);

System.out.println(val1BD.subtract(val2BD));
Run Code Online (Sandbox Code Playgroud)

最后我得到了输出0.9.

我的问题是案例2和案例3有什么区别?

在案例2中为什么我得到这样的输出?

Cod*_*roc 8

BigDecimal.valueOf(double d) 使用String内部Double.toString(double)使用的double值的规范表示,这就是你0.9在第二种情况下获得的原因.

注意:这通常是将double(或float)转换为BigDecimal的首选方法,因为返回的值等于使用结果构造BigDecimal所产生的值 Double.toString(double).

虽然使用new BigDecimal(0.9)它可以将值转换为值的精确浮点表示,double而无需使用String表示,

将double转换为a BigDecimal,这是double的二进制浮点值的精确十进制表示.

...

注意:

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

...

例如 :

BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
BigDecimal bd2 = new BigDecimal(0.9);
System.out.println(bd1);
System.out.println(bd2);
Run Code Online (Sandbox Code Playgroud)

输出:

0.9
0.90000000000000002220446049250313080847263336181640625
Run Code Online (Sandbox Code Playgroud)

  • 也许值得一提的是,初始化`BigDecimal`的最好方法是来自`String`或`char []`.一旦你有'double`,就会出现舍入误差.转换回`String`可能会也可能不会撤消该错误.在数学上,如果您关注准确性,那么精确的双值是更好的选择. (2认同)