I’m having an issue with BigDecimal
s, the simplified idea is to:
- define a value for the
total
- split the
total
in 3parts
defined byweights
, these weights are 3 double values that add up to100.0
- sum up the
parts
- the sum should be close to the
total
, the error should be at most 0.00000001
Here’s the failing test:
@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")) }
What’s missing?
Advertisement
Answer
Given your weights sum to 100.000000000000002, the value of sumOfParts
is 2000000000.000000040
, which is 0.00000004
from your original value, which is four times bigger than the desired difference of 0.00000001
.