【发布时间】:2021-09-27 17:18:46
【问题描述】:
考虑以下 BigDecimals
BigDecimal("6.0000").precision() // = 5
BigDecimal("0.20000").precision() // = 5
当你划分那些 BigDecimals 时:
BigDecimal("6.0000").divide(BigDecimal("0.20000")) // = 3E+1
和
BigDecimal("6.0000").divide(BigDecimal("0.20000")).precision() // = 1
因此,将两个精度为 5 的 BigDecimal 相除会得到精度为 1 的 BigDecimal。即使通过提供 MathContext 将精度显式设置为 5,结果也是相同的:
BigDecimal("6.0000").divide(BigDecimal("0.20000"), MathContext(5, RoundingMode.HALF_UP)) // = 3E+1
另一方面,当我设置 scale 时,我最终得到了更高的精度
BigDecimal("6.0000").divide(BigDecimal("0.20000"), 5, RoundingMode.HALF_UP).precision() // = 7
有没有办法在执行上述除法时保持精度?这是否只能通过指定scale 而不是precision 来实现?
关于scale,javadoc 指出首选 分割比例是dividend.scale() - divisor.scale()。但是,它也指出
这些尺度是返回精确算术结果的方法所使用的尺度;除了精确除法可能必须使用更大的比例,因为精确结果可能有更多位数。例如,1/32 是 0.03125。
上述情况不就是这样吗,因为确切的结果需要更多的数字?
【问题讨论】:
-
在您需要将值转换为字符串之前,我不会担心精度。
MathContext(5, RoundingMode.HALF_UP)将有助于在计算过程中将精度保持在一定水平,但对于计算本身而言,值是 30、30.0 还是 30.000(它始终是相同的数值)并不重要。在返回结果或将其转换为字符串时,只需在最后设置比例(这是尾随零很重要的唯一情况)。 -
@Sweeper 是 Kotlin
标签: java kotlin rounding bigdecimal