如何使 BigDecimal 除法更精确

问题描述

我遇到了 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} 的期望差值的四倍}}。