我对你有意见 BigDecimal
s、 简化的想法是:
定义 total
分开 total
在3 parts
定义人 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"))
}
少了什么?
1条答案
按热度按时间gblwokeq1#
如果权重总和为100.000000000000002,则
sumOfParts
是2000000000.000000040
,即0.00000004
从你的原始价值,这是四倍大的期望差异0.00000001
.