划分 BigDecimals 时保留中间结果的最大精度

Preserve maximum precision for intermediate results when dividing BigDecimals

我用 BigDecimal 做了几次计算,然后才 return 得出最终结果。我的计算包含两个部分。我知道我应该在调用 divide() 时定义缩放和舍入模式。但是,由于我使用的是货币,所以我想尽可能长时间地保持最大精度,并且 只将我的最终结果 舍入到小数点后两位。

我应该对中间结果应用什么缩放和舍入模式以获得最大精度?

通常在物理学中,中间结果多取一位数字。

我认为对您问题的任何具体回答都可能需要进一步详细说明您需要最终结果的准确性,尤其是当您在最后四舍五入时。

我个人会尝试完全解决这个问题并使用某种形式的 Rational 对象。

How to actually avoid floating point errors when you need to use float? 可能会有一些帮助。

假设,你做了类似 (a / b) / c 的操作。

我不会先计算(a / b)。我宁愿将其重组为

a / (b * c)

它不仅不需要中间舍入,而且会更优化。

(a / b) / c = a / (b * c)

证明:

(a / b) / c = (a * b^-1) * c^-1 = a * (b^-1 * c^-1) = a * 1 / (b * c) = a / (b * c)

我找到了一个有用的网站,其中包含使用 BigDecimal 提供精度的示例、解释和结果。快速阅读。

它展示了执行计算的各种方式并提供了清晰的示例:http://java-performance.info/bigdecimal-vs-double-in-financial-calculations/

希望对您有所帮助。