我们目前正在运行一些涉及两位小数的天花板数的测试。为了实现这一目标,我们使用的是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的数字必须在模式的范围内。这是一个错误还是我错过了什么?
答案 0 :(得分:0)
看起来像个错误。这段代码
BigDecimal bd = new BigDecimal("0.0000001");
bd = bd.setScale(2, RoundingMode.CEILING);
System.out.println(bd);
产生正确的结果
0.01