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 回答