I am using BigDecimalCloseTo and getting something weird in the error message. In the example below, I have the exact value 0.0066 and an approximation of it which differs by 1.01E-16. I want to check for a precision of 1e-16, so BigDecimalCloseTo correctly identifies this as not close enough. However the error message states:
"Expected: a numeric value within <1E-16> of <0.00660> but: <0.006599999999999899> differed by <1E-18>"
But if it only differed by 1e-18 it would be close enough. Looking at the code, it looks like the value calculated for the error message (actualDelta() method) also subtracts the delta (= precision), so it does: abs(item - value) - delta instead of abs(item - value)
@Test
public void test()
{
final BigDecimal precision = new BigDecimal(1).movePointLeft(16);
System.out.println("Precision " + precision);
// Exact result is: 0.0066
// Actual result is: 0.006599999999999899
final BigDecimal exact = new BigDecimal(66).movePointLeft(4);
final BigDecimal actual = new BigDecimal(6599999999999899L).movePointLeft(18);
System.out.println("Exact is " + exact);
System.out.println("Correct is " + actual);
System.out.println("Difference is " + exact.subtract(actual));
final BigDecimal item = actual;
final BigDecimal value = exact;
final BigDecimal delta = precision;
// This is the code that produces the value in the error message
final BigDecimal errorMsgValue =
item.subtract(value, MathContext.DECIMAL128).abs()
.subtract(delta, MathContext.DECIMAL128).stripTrailingZeros();
System.out.println(errorMsgValue);
assertThat(actual, BigDecimalCloseTo.closeTo(exact, precision));
}
Output is: Precision 1E-16 Exact is 0.0066 Correct is 0.006599999999999899 Difference is 1.01E-16 1E-18
Comment #1
Posted on Aug 19, 2013 by Massive Hippo(No comment was entered for this change.)
Status: New
Labels:
Java