【发布时间】:2017-05-12 07:19:22
【问题描述】:
我有一个这样定义的BigDecimal:
private static final BigDecimal sd = new BigDecimal(0.7d);
如果我打印它,我会得到值:
0.6999999999999999555910790149937383830547332763671875
这会导致一些错误的计算。有谁知道将0.7 的确切值作为BigDecimal 的方法?把它改成0.71会看到正确的结果,但不应该是这样的
【问题讨论】:
-
用
Double检查构造函数逻辑,你会明白这种转换之间的困难;) -
感谢所有答案,但我真的不明白为什么转换失败。我以为如果位数超过精度,我只会用双精度得到错误的值。 0.7 应该完全是 0.7,
double d=0.7d; Float f=new Float(0.7); System.out.println(f); System.out.println(d);在这两种情况下都正好打印 0.7。 -
double d = 0.7d;不要只存储像int = 0dec = 7这样的值,而是使用使用指数的尾数逻辑,反向逻辑用于创建BigDecimal。在这种情况下会发生浮点值精度丢失 -
源代码到double的转换不精确。从(不精确的)double 到 BigDecimal 的转换是精确的。
-
@XtremeBaumer:很明显,您并不完全理解 binary 浮点类型,例如
double或float。请查看docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 或者更简单的floating-point-gui.de/formats/fp。这可能解释了为什么0.7永远不能以这种格式精确表示,但为什么例如0.5、0.375、0.75甚至0.0234375(= 3/128) 都可以。
标签: java bigdecimal