2014-03-31 381 views
0

我的代碼如下:奇怪行爲

Number inputAmount = NumberFormat.getNumberInstance(Locale.FRANCE).parse("7,10"); 
double doubleValue = inputAmount.doubleValue(); 
int intValue = (int) (doubleValue * 100); 

System.out.println("Input: " + inputAmount); 
System.out.println("Double: " + doubleValue); 
System.out.println("Integer: " + intValue); 

,其輸出:

Input: 7.1 
Double: 7.1 
Integer: 710 

但是,當inputValue是5,10的輸出:

Input: 5.1 
Double: 5.1 
Integer: 509 

這隻發生在5,10和4,10。我知道這是由於雙精度而發生的,但我無法弄清楚究竟如何。 任何想法?

+0

貌似4和5不能精確表示像7可以.. – Maroun

+0

嘗試使用的BigDecimal –

+0

是的,我在遇到這個問題後使用了BigDecimal,並修復了它,但我想知道爲什麼第一種方法不起作用。 – user3139293

回答

0

這裏的問題是,乘法5.1d * 100d產生舍入誤差,導致509.99999999999994d。當你把這個double加入一個整數時,結果顯然是509

要明白是怎麼回事,考慮以下因素:

double doubleValue = 5.1d * 100d; // rounding error... 
System.out.println("Double: " + doubleValue); 
int intValue = (int) doubleValue; 
System.out.println("Integer: " + intValue); 

輸出:

Double: 509.99999999999994 
Integer: 509 
+0

奇怪的是,它只發生在5.10和4.10值。 – user3139293

0

嘗試改變:

int intValue = (int) (doubleValue * 100); 

到:

int intValue = (int) (doubleValue * 100d); 

你的代碼是相當簡單了,我在想一些奇怪的可能發生的事情與內部澆鑄時乘。在最終轉換爲int之前,100d將強制它將兩個雙打相乘。

+0

這沒有奏效。 :/ – user3139293