2014-04-11 54 views
2

我嘗試將double值舍入到2位小數,但我總是得到0.0。我嘗試了三種方法。舍入雙精度到2位小數返回總是0.0

第一:

System.out.println(Math.round(reward*100.0)/100.0); 

二:

System.out.println(String.valueOf(round(reward, 2))); 
private double round(double value, int places)  
    if (places < 0) throw new IllegalArgumentException(); 

     BigDecimal bd = new BigDecimal(value); 
     bd = bd.setScale(places, RoundingMode.HALF_UP); 

    return bd.doubleValue(); 
} 

三:

DecimalFormat df = new DecimalFormat("###.##"); 
System.out.println(df.format(reward)); 

每次我只得到0.0。示例值:

  • 5.957818181818184E-16 0.0
  • 3.927272727272729E-18 0.0
  • 3.1250000000000005E-16 0.0
  • 1.6000000000000006E-19 0.0

缺少什麼我在這裏?

謝謝!

+0

你爲什麼要圓呢?你想打印結果還是在進一步的計算中使用它? –

+0

而且:'6 * 10^-16'是'0.0000000000000006',取整時應該是'0.0'。 –

+0

該值不一定是確切的。我需要它進行進一步的計算,在這裏印刷我只是想展示我如何測試這些值。 – mapf

回答

2

你引用的所有例子都是非常非常小的數字。如果你把它們放到兩個地方,結果是零。這就是爲什麼你會得到你得到的結果;他們是正確的。與scientific notation負指數告訴我們。例如,是0.2。您可以寫出數字,然後將小數點向左移動指數中給出的次數(如果指數爲正數,則該數字在右邊)。所以,你的

5.957818181818184E-16

是真的:

0.0000000000000005957818181818184

...這四捨五入到兩個地方是0.00

4

您正在測試的四個值應該四捨五入爲0.0!

5.957818181818184E-16等於5.95... * 10^(-16)等於0.000...0595...在第一個非零數字前面有16個零。類似於您的其他值。您是否熟悉scientific notation

+0

如果在小數點前不計數0,則爲零。 –

+0

好的,謝謝。小數點後15個零,所以5是小數點後的第16位。 – SebastianH