2013-03-24 75 views
2

我有一個奇怪的問題。我試圖將方程的結果存儲到雙變量中。奇怪的Java數學執行

double s = (((100 + 1)*(1/3))/100 + (1/3)); 

這將返回值a 0而不是.67(從計算器計算出的正確值)。爲什麼會發生這種情況?

注:說我可以只讓S = 0.67是不是一個解決方案,

提前感謝的解決方案。

+1

如果添加'D'畢竟你的數字,例如'100d',你將使用浮點操作,而不是整數操作。 – jedwards 2013-03-24 14:21:24

+0

正如已經回答的那樣,我只是增加了一個側面提示,如果你想要'0.67'的精確值不像'0.669999999999',你應該使用'BigDecimal'。 http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-java – gaganbm 2013-03-25 13:57:58

回答

8

下面使用整數(即截斷)劃分,其結果是零:

1/3 

要獲得浮點除法,打開任一參數的成雙重,例如

1.0/3 

因此,整個表達式變爲:

double s = (((100 + 1)*(1./3))/100 + (1./3)); 

1.相同1.0。表達與double相同的號碼的其他方式是1d1D

以上表達式評估爲0.6699999999999999

+0

是的,我不知道我是如何讓這個滑倒。非常感謝。這一直困擾我很長一段時間。 – 2013-03-24 14:21:01

3

編譯器看到你的numers爲INT的..

嘗試這樣的:

double s = (((100d + 1d)*(1d/3d))/100d + (1d/3d)); 

現在的結果將是:

0.6699999999999999