2011-09-21 74 views
-1

什麼會打印到控制檯,爲什麼?BigDecimal奇怪的舍入行爲?

1.

BigDecimal BigDecimalNum = new BigDecimal("0.0774"); 
System.out.println(BigDecimalNum.doubleValue() * 100.00); 

2.

BigDecimal BigDecimalNum2 = new BigDecimal("0.0774"); 
System.out.println(BigDecimalNum2.multiply(new BigDecimal("100.00"))); 
+1

與其讓我們自己猜測或運行它,爲什麼你沒有說出正在打印的內容以及爲什麼你對此感到驚訝? –

+1

什麼打印到控制檯?來吧,你可以嘗試一下,不是嗎? –

回答

5

我的機器上的結果是:

7.739999999999999 
7.740000 

這根本不會讓我感到吃驚。在第二種情況下,我們完全處理BigDecimal,並且總是相乘 - 沒有任何理由出錯。

在第一種情況下,你要轉換的BigDecimal來了一倍,所以你的代碼是有效

double d = 0.0774; 
System.out.println(d * 100.0); 

值0.0774不能準確地表示爲double,因此差異。

這與BigDecimal無關,與double有關。你應該幾乎從不BigDecimaldouble之間轉換,但 - 那種哪些適合在BigDecimal使用價值的幾乎都是不合適表示爲double值。

+0

0.0774是兩倍的問題?我沒有看到任何問題。 double d = 0.0774; System.out.println(d); d = 7.74; System.out.println(d); 給我想要的結果。 – dmitril

+1

@dmitril:它不能完全保存爲雙精度。最接近0.0774的雙倍值僅略小於0.0774。閱讀其他相關問題 - 我現在不能添加太多內容,但如果您仍然感到困惑,稍後會回來。閱讀http://csharpindepth.com/Articles/General/FloatingPoint.aspx(它是關於.NET編寫的,但是在Java中適用的原則完全相同,均使用IEEE-754二進制浮點數。) –

+0

謝謝,現在很清楚。我只是習慣了C/C++,在那裏你可以做這樣的數學計算,而不必記住這些東西。 – dmitril