2013-08-27 39 views
2

我們目前正在運行一些涉及天花板數字有兩位小數的測試。爲了實現這一點,我們使用Java的DecimalFormatDecimalFormat不是天花板正確

但是,測試得到了奇怪的結果,特別是當我們想要增加一個'0.00xxx'數字時。

以下是正在使用的測試DecimalFormatter實例:

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

這個測試按預期工作,也就是說,它是正確ceiled:

//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); 
    } 

你能解釋爲什麼w e得到這種行爲。謝謝

編輯:如評論請求的另一個測試。仍然不起作用。

//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

+1刪除我的答案是錯誤的:( –

+0

嘗試同樣與0.0000006。請告訴我結果? –

+0

這是因爲四捨五入不會只考慮一個數字超出了要求格式,數字被截斷爲'0.000',然後舍入到'0.00',但我不知道如何改變這種行爲, – Bobby

回答

0

看起來像一個錯誤。此代碼

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

產生正確的結果

0.01 
+0

如果它是一個錯誤,它是一個非常嚴重的錯誤.... – Goaler444