【发布时间】:2014-08-07 09:38:51
【问题描述】:
执行以下代码:
new BigDecimal(0.06 * 3).toString()
返回 0.179999999999999993338661852249060757458209991455078125 而不是 0.18。
执行中
new BigDecimal(0.06).multiply(new BigDecimal(3)).toString()
返回相同的结果。
这怎么可能?
【问题讨论】:
-
+1 - 虽然第一个代码的错误非常明显,但第二个代码的问题在编码过程中极容易被忽略,并且可能会在代码中一遍又一遍地引入细微的错误。我什至会说它应该能够在 IDE 中为它生成警告。
-
考虑到引用 ",这个构造函数的结果可能有点不可预测。人们可能会假设用 Java 编写 new BigDecimal(0.1) 会创建一个 BigDecimal,这正是等于 0.1(未缩放的值为 1,比例为 1),但它实际上等于 0.1000000000000000055511151231257827021181583404541015625" - 来自 API 文档docs.oracle.com/javase/8/docs/api/java/math/…
-
@Marco13 如果 Oracle 文档明确指出它可能是不可预测的(因此令人困惑),我倾向于说在 SO 上进行问答会更合适,而且你已经只是给出了这个问题值得投票的另一个原因
标签: java math bigdecimal