當我試圖執行這段代碼,它給了我一個很奇怪的答案JavaScript的加減行爲怪異
<script type="text/javascript">
a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0;
alert(a);
</script>
它實際上應該給我一個零。但是,它給了我一個指數值。 有人可以幫我解答。
當我試圖執行這段代碼,它給了我一個很奇怪的答案JavaScript的加減行爲怪異
<script type="text/javascript">
a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0;
alert(a);
</script>
它實際上應該給我一個零。但是,它給了我一個指數值。 有人可以幫我解答。
你應該得到-1.7763568394002505e-15。這代表-1.7763568394002505 * 10 ^( - 15)。這是一個非常接近零的值;但是你沒有得到零的事實是由於舍入誤差。這是正常行爲。
如果你真的想知道的細節,就可以在多http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
這對於浮點計算正常的行爲找出來。
只能使用二進制浮點格式精確表示的數量有限,因此大多數值都表示爲最接近的可能值。
像7.99
這樣的值可能表示爲7.98999999999997754
之類的值,因此這是您在解析代碼時實際獲得的值。
實際值與您所期望的值之間的差異非常小,以至於當您直接顯示該值時它不會顯示,因爲該值在轉換回字符串格式時被舍入。當你做幾次計算時,小的差異加起來,遲早你會看到它。
你得到的結果是-0.0000000000000017763568394002505
,所以它非常接近零,但它不完全是零。
計算機處理浮點並不是很好。
例如: 0.1 + 0.2 = 0.30000000000000004
因爲內部,計算機使用的格式(二進制浮點) 即不能準確地表示相同的0.1,0.2或0.3,在所有的數。 當代碼被編譯或解釋時,您的「0.1」已經被 四捨五入到該格式的最接近的數字,即使在計算髮生之前,這也會導致一個小的舍入誤差。
瞭解更多關於:What Every Programmer Should Know About Floating-Point Arithmetic
你可以閱讀更多關於此這裏http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-問題 –