我正在尝试以大于双精度的固定精度在 Scala(和/或 Java)中进行计算。我将 BigDecimals 与 Scala 的默认MathContext一起使用,其精度为 34。即使所有输入都具有此精度,但我发现经过几次计算后,结果的精度开始爆炸式增长。
这是一个我认为可以说明问题的示例计算:
import math.BigDecimal
val z40 = BigDecimal(0).setScale(40) // 0E-40
z40.scale // 40
z40.precision // 1
(1 + z40*z40).precision // 81
结果为 81,精度高于z40
. 就我而言,我从不使用 setScale,但在计算中会出现比例非常大的零。
这不是我想要的行为。我想要(1 + z40*z40)
精度 34 - 执行计算的 MathContext 的精度(因为z40*z40
与 1 相比小得可以忽略不计)。我怎样才能得到这种算术?
更新:此行为是由于Scala 2.9.* 和 2.10.* 之间的 MathContexts 处理发生了变化。(感谢 Paul Phillips 指出提交。)另请参阅此讨论。