0

したがって、値 0.99 を保持する BigDecimal があり、次のように呼び出します。

  • Float.toHexString(rationalNumber.floatValue()) 0x1.fae148p-1を取得します
  • Double.toHexString(rationalNumber.doubleValue()) 0x1.fae147ae147aep-1を取得します

0.99 のような小さな数値を表しているので、関係なく同じ 16 進数値を取得する必要があると考えています。同意?

コード (テストの失敗):

@Test public void testDelta() {
    BigDecimal rationalNumber = new BigDecimal("0.99").setScale(2,BigDecimal.ROUND_DOWN);

    String hexFromFloat = Float.toHexString(rationalNumber.floatValue());
    String hexFromDouble = Double.toHexString(rationalNumber.doubleValue());

    String hexFromFloatMsg = rationalNumber.floatValue() + " = " + hexFromFloat;
    String hexFromDoubleMsg = rationalNumber.doubleValue() + " = " + hexFromDouble;

    Assert.assertEquals(hexFromFloatMsg + ", " + hexFromDoubleMsg, hexFromDouble, hexFromFloat);
}

出力:

org.junit.ComparisonFailure: 0.99 = 0x1.fae148p-1, 0.99 = 0x1.fae147ae147aep-1 
Expected :0x1.fae147ae147aep-1
Actual   :0x1.fae148p-1
4

2 に答える 2

-1

0.99 のような小さな数値を表しているため、関係なく同じ 16 進数値を取得する必要があります。同意?

10 進数では小さな精度ですが、ご覧のとおり、その 16 進数表現は ( 0x1.f(ae147)*) を繰り返します。正確に表現されていますが、正確に印刷することはできません。

于 2013-10-26T15:02:02.400 に答える