Export to GitHub

hamcrest - issue #201

BigDecimalCloseTo bug in error message


Posted on Jul 27, 2013 by Quick Dog

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(&quot;Precision &quot; + 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(&quot;Exact is &quot; + exact);
    System.out.println(&quot;Correct is &quot; + actual);

    System.out.println(&quot;Difference is &quot; + 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