DecimalFormat没有正确上限

时间:2013-08-27 09:25:27

标签: java decimalformat ceil

我们目前正在运行一些涉及两位小数的天花板数的测试。为了实现这一目标,我们使用的是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的数字必须在模式的范围内。这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

看起来像个错误。这段代码

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

产生正确的结果

0.01