如何使bigdecimal除法更精确

qv7cva1a  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(358)

我对你有意见 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"))
    }

少了什么?

gblwokeq

gblwokeq1#

如果权重总和为100.000000000000002,则 sumOfParts2000000000.000000040 ,即 0.00000004 从你的原始价值,这是四倍大的期望差异 0.00000001 .

相关问题