如何解决BigDecimal 在除法时失去精度
考虑以下 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。
上面的情况不就是这样吗,因为确切的结果需要更多的数字?
解决方法
就您而言,它是 does not really matter,因为结果是精确的。如果您需要具体的精度(可能用于解析),请在最后使用 setScale
。
如果一个函数需要失去精度才能给出结果(例如,因为将 1 除以 3),除法会抛出异常(在使用 divide
函数的情况下,因为 Kotlin {{ 1}} 运算符会将结果四舍五入,从而失去精度)。所以除法的时候最好自己设置精度和舍入方式。
div
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。