3

これらのテストの動作が異なるのはなぜですか?

public void testRoundFloat() {
    final NumberFormat format = NumberFormat.getNumberInstance();
    format.setMaximumFractionDigits(2);
    format.setMinimumFractionDigits(2);
    format.setRoundingMode(RoundingMode.HALF_UP);
    assertEquals("102,345.56", format.format(102345.556f));
}

public void testRoundDouble() {
    final NumberFormat format = NumberFormat.getNumberInstance();
    format.setMaximumFractionDigits(2);
    format.setMinimumFractionDigits(2);
    format.setRoundingMode(RoundingMode.HALF_UP);
    assertEquals("102,345.56", format.format(102345.556d));
}

float を丸める最初のテストはフォーマットの結果が xxx.55 であるため失敗し、double を丸める 2 番目のテストは成功します。Android 4.2.2 (レベル 17) でテストを実行しています

ありがとうマーカス

4

2 に答える 2

1

Javafloatは標準の IEEE 32 ビット浮動小数点であり、10 進数でおよそ 6 桁の精度しか維持できません。リテラル102345.556fを内部形式に変換するときの丸め表現が原因で、最初のテストは失敗します。

丸め誤差を減らすdoubleには、拡張精度の場合は または を使用しますBigDecimal

参考資料:すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと

于 2013-07-10T07:04:21.013 に答える