在我返回最终结果之前,我会使用BigDecimal
进行一些计算。我的计算包含两个部分。我知道在调用divide()
时我应该定义一个比例和舍入模式。但是,由于我使用的是货币,我希望尽可能保持最高精度,并且仅将我的最终结果舍入到两位小数。
我应该将哪种比例和舍入模式应用于中间结果以获得最大精度?
答案 0 :(得分:4)
我们假设您执行类似(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)
答案 1 :(得分:2)
通常在物理学中,我们再拿一个数字作为中间结果。
答案 2 :(得分:2)
我找到了一个有用的网站,其中包含使用BigDecimal提供精确度的示例,解释和结果。这是一个快速阅读。
它显示了执行计算的各种方法,并提供了明确的示例:http://java-performance.info/bigdecimal-vs-double-in-financial-calculations/
我希望它有所帮助。
答案 3 :(得分:1)
我认为对你的问题的任何具体答案可能需要一些关于你需要最终结果的准确性的进一步细节,特别是当你最后完成时。
我个人会尝试完全删除此问题并使用某种形式的Rational
对象。
How to actually avoid floating point errors when you need to use float?可能会有所帮助。