2013-07-30 34 views
1

當我試圖執行這段代碼,它給了我一個很奇怪的答案JavaScript的加減行爲怪異

<script type="text/javascript"> 
    a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0; 
    alert(a); 
</script> 

它實際上應該給我一個零。但是,它給了我一個指數值。 有人可以幫我解答。

+0

你可以閱讀更多關於此這裏http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-問題 –

回答

2

你應該得到-1.7763568394002505e-15。這代表-1.7763568394002505 * 10 ^( - 15)。這是一個非常接近零的值;但是你沒有得到零的事實是由於舍入誤差。這是正常行爲

如果你真的想知道的細節,就可以在多http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

我解決了這樣的問題: \t 這給我完全爲零。感謝大家的回覆。 – unknown

+1

爲什麼你想要完全爲零?你必須讓你的想法,電腦會一直給你近似的結果,或準備頭痛。很高興有-1。7763568394002505e-15已經! – mdup

1

這對於浮點計算正常的行爲找出來。

只能使用二進制浮點格式精確表示的數量有限,因此大多數值都表示爲最接近的可能值。

7.99這樣的值可能表示爲7.98999999999997754之類的值,因此這是您在解析代碼時實際獲得的值。

實際值與您所期望的值之間的差異非常小,以至於當您直接顯示該值時它不會顯示,因爲該值在轉換回字符串格式時被舍入。當你做幾次計算時,小的差異加起來,遲早你會看到它。

你得到的結果是-0.0000000000000017763568394002505,所以它非常接近零,但它不完全是零。

1

計算機處理浮點並不是很好。

例如: 0.1 + 0.2 = 0.30000000000000004

因爲內部,計算機使用的格式(二進制浮點) 即不能準確地表示相同的0.1,0.2或0.3,在所有的數。 當代碼被編譯或解釋時,您的「0.1」已經被 四捨五入到該格式的最接近的數字,即使在計算髮生之前,這也會導致一個小的舍入誤差。

瞭解更多關於:What Every Programmer Should Know About Floating-Point Arithmetic

0
a = Math.ceil(17.98 + 7.99 - 17.98 - 7.99 + 0 - 0); 
+0

雖然這會給出四捨五入的價值,但它並不能解釋_爲什麼會發生這種情況 - 我認爲這是問題所在。 –

+0

以前許多專家已經給出瞭解釋,這個是因爲_它實際上應該給我一個zero._部分的問題,因爲OP似乎想要一個四捨五入的值 – rps

+0

我解決了這個問題:這給我完全爲零。感謝大家的回覆。 – unknown