【问题标题】:Preserve maximum precision for intermediate results when dividing BigDecimals在除法 BigDecimals 时保持中间结果的最大精度
【发布时间】:2015-07-30 12:56:12
【问题描述】:

在返回最终结果之前,我使用 BigDecimal 进行了几次计算。我的计算包含两个部分。我知道在调用divide() 时我应该定义一个比例和舍入模式。但是,由于我使用的是货币,因此我希望尽可能长时间地保持最大精度,并且只将最终结果四舍五入到小数点后两位。

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

【问题讨论】:

  • 除非您需要超过 15 位的精度,否则我会使用 double 并在最后舍入结果。使用double 编码更简单,速度更快。

标签: java precision division bigdecimal


【解决方案1】:

假设,你做了类似 (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)

【讨论】:

  • 这是一个聪明的方法。谢谢。
【解决方案2】:

通常在物理学中,我们会多取一位作为中间结果。

【讨论】:

  • 这听起来很合理。
【解决方案3】:

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

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

希望对你有帮助。

【讨论】:

    【解决方案4】:

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

    我个人会尝试完全消除该问题并使用某种形式的Rational 对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多