问题描述
我遇到了 BigDecimal
的问题,简化的想法是:
- 为
total
定义一个值 - 将
total
分成由parts
定义的 3 个weights
,这些权重是 3 个加起来为100.0
的双值 - 总结
parts
- 总和应该接近
total
,误差最多应该是 0.00000001
这是失败的测试:
@Test
fun sanityCheckExampleForStackOverflow() {
val whole = BigDecimal.valueOf(2_000_000_000.00)
val weights = listof("25.453778250984232","35.38647064849812","39.15975110051765").map { BigDecimal(it) }
val parts = weights.map { weight ->
// w / 100 * total
weight.divide(BigDecimal(100)).times(whole)
}
val sumOfParts = parts[0] + parts[1] + parts[2]
val difference = sumOfParts - whole
assertTrue(difference <= BigDecimal("0.00000001"))
}
缺少什么?
解决方法
假设您的权重总和为 100.000000000000002,sumOfParts
的值是 2000000000.000000040
,与您的原始值相差 0.00000004
,这是 {{1} 的期望差值的四倍}}。