2

現在、小数点以下 2 桁の上限値を含むいくつかのテストを実行しています。これを実現するために、Java のDecimalFormatを使用しています。

ただし、特に「0.00xxx」の数値を上限にしたい場合は、テストで奇妙な結果が得られます。

以下は、テストで使用されている DecimalFormatter のインスタンスです。

DecimalFormat decimalFormatter = new DecimalFormat("#########0.00");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

このテストは期待どおりに機能します。つまり、正しく上限が設定されています。

//The below asserts as expected
    @Test
    public void testDecimalFormatterRoundingDownOneDecimalPlace3()
    {
        String formatted = decimalFormatter.format(234.6000000000001);
        Assert.assertEquals("Unexpected formatted number", "234.61", formatted);
    }

ただし、これは次のことを行いません。

//junit.framework.ComparisonFailure: Unexpected formatted number 
//Expected :0.01
//Actual   :0.00

    @Test
    public void testSmallNumber()
    {
        double amount = 0.0000001;

        String formatted = decimalFormatter.format(amount);
        Assert.assertEquals("Unexpected formatted number", "0.01", formatted);
    }

この動作が発生する理由を説明してください。ありがとう

編集:コメントで要求された別のテスト。それでも機能しません。

//junit.framework.ComparisonFailure: null
//Expected :0.01
//Actual :0.00

@Test
public void testStackOverflow() throws Exception
{
double amount = 0.0000006;
String formatted = decimalFormatter.format(amount);
Assert.assertEquals("Unexpected formatted number", "0.01", formatted);
}

それが機能するには、0 より大きい数値がパターンの範囲内にある必要があることに気付きました。これはバグですか、それとも何か不足していますか?

4

1 に答える 1

0

バグのように見えます。このコード

    BigDecimal bd = new BigDecimal("0.0000001");
    bd = bd.setScale(2, RoundingMode.CEILING);
    System.out.println(bd);

正しい結果を生成します

0.01
于 2013-08-27T10:23:40.560 に答える