我想减去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之间的区别是什么?
在第二种情况下,为什么我会得到这样的输出?
发布于 2015-09-13 13:18:13
BigDecimal.valueOf(double d)使用规范的String表示为双精度值,内部使用Double.toString(double),这就是为什么在第二种情况下会得到0.9。
注意:这通常是将双精度型(或浮点型)转换为BigDecimal的首选方法,因为返回的值等于从使用
Double.toString(double)的结果构造BigDecimal时返回的值。
而对于new BigDecimal(0.9),它将值转换为double值的精确浮点表示,而不使用String表示,
将double转换为
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发布于 2018-10-23 22:37:14
对于那些在这里寻找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);https://stackoverflow.com/questions/32546553
复制相似问题