我想减去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中为什么我得到这样的输出?
答案 0 :(得分:8)
BigDecimal.valueOf(double d)
使用内部String
的双值的规范Double.toString(double)
表示,这就是您在第二种情况下获得0.9
的原因。
注意:这通常是转换double(或者)的首选方法 浮动)到BigDecimal,因为返回的值等于 从使用结果构造BigDecimal得到的结果
Double.toString(double)
。
使用new BigDecimal(0.9)
时,它会将值转换为double
值的精确浮点表示,而不使用String
表示,
将双精度转换为
BigDecimal
,这是精确的小数 表示double的二进制浮点值。<强> ... 强>
注意:
- 此构造函数的结果可能有些不可预测。
醇><强> ... 强>
例如:
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
答案 1 :(得分:0)
对于那些来到这里寻找BigDecimal的其他问题的人(与上面的问题无关)... 请记住为方法提供mathContext以避免某些问题,例如
MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
BigDecimal hitRate = new BigDecimal(totalGetValuesHitted).divide(new BigDecimal(totalGetValuesRequested), mc);
BigDecimal missRate = new BigDecimal(1.0, mc).subtract(hitRate, mc);