BigDecimal精确爆炸

dav*_*dsd 5 java math scala bigdecimal arbitrary-precision

我正在尝试以大于双精度的固定精度在Scala(和/或Java)中进行计算.我正在使用带有Scala默认MathContext的 BigDecimals ,它具有精度34.即使所有输入都具有这种精度,我发现经过一些计算后,结果的精度开始爆炸.

这是一个示例计算,我认为说明了问题:

import math.BigDecimal

val z40 = BigDecimal(0).setScale(40) // 0E-40
z40.scale                            // 40
z40.precision                        // 1
(1 + z40*z40).precision              // 81
Run Code Online (Sandbox Code Playgroud)

结果是81,精度高于z40.在我的例子中,我从不使用setScale,但是计算中出现了具有非常大比例的零.

这不是我想要的行为.我想要(1 + z40*z40)精度34 - 正在执行计算的MathContext的精度(因为z40*z40与1相比可以忽略不计).我怎么能得到这种算术?

更新:此行为是由于Scala 2.9.*和2.10.*之间的MathContexts处理的更改.(感谢Paul Phillips指出了提交.)另见本讨论.

808*_*und 0

其实我相信最后一行

(1 + z40*z40).precision
Run Code Online (Sandbox Code Playgroud)

产生结果34(不是81)。我认为这里的精度实际上并没有提高。