2010-08-09 35 views
32

可能重複:
Is JavaScript’s Math broken?爲什麼在Javascript中添加兩位小數會產生錯誤的結果?

爲什麼JS搞砸了這個簡單的數學?

document.write(.1 + .2) // 0.3000000000000004 
document.write(.3 + .6) // 0.8999999999999999 

第一個例子大於正確結果,而第二個例子小於第二個例子。 ??? !!你如何解決這個問題?在執行操作之前,您是否必須始終將小數轉換爲整數?我只需要擔心添加(*和/在我的測試中似乎沒有相同的問題)?

我看了很多地方的答案。有些教程(如購物車表單)假裝問題不存在,只是將值相加。大師們爲各種數學功能提供複雜的例程,或提到JS「做得不好」,但我還沒有看到解釋。

+0

檢查這個問題的答案:http://stackoverflow.com/questions/588004/is-javascripts-math-broken – 2010-08-09 10:23:11

+0

可能重複數以千計的這個問題和每一個編程相關的論壇。 – 2010-08-09 10:34:12

+0

再次?我們真的需要寫一個FAQ。 – 2010-08-09 10:37:03

回答

6

這不僅限於JavaScript,它適用於所有浮點計算。問題是0.1和0.2和0.3不能完全表示爲JavaScript(或C或Java等)浮動。因此,你看到的輸出是由於不準確。

特別是只有兩個冪的一定的和才能完全表示。 0.5 = = 0.1b = 2 ^( - 1),0.25 = 0.01b =(2^-2),0.75 = 0.11b =(2^-1 + 2^-2)都可以。但是1/10 = 0.000110001100011..b只能表示爲2的冪的無窮和,這種語言在某個點上切掉。它的這種斬波導致了這些輕微的錯誤。

4

The Floating-Point Guide

爲什麼我的數字,像0.1 + 0.2 加起來一個漂亮的圓0.3, 而是我得到一個怪異的結果像 0.30000000000000004?

因爲內部,計算機使用 格式(二進制浮點),該 不能準確地表示多個 像0.1,0.2或0.3的。

當代碼被編譯或解釋 ,你的「0.1」是已經 四捨五入至在於 格式最接近的數字,這導致一個小 舍入誤差的 計算髮生甚至之前。

該網站有詳細的解釋以及如何解決問題(以及如何決定它是否在你的情況下是一個問題)的信息。

+0

更簡單的答案。 – hamzox 2018-02-20 07:25:58

15

這不是一個JS問題,而是一個更通用的計算機。浮點數無法正常存儲所有十進制數字,因爲他們在二進制 存儲的東西例如:

0.5 is store as b0.1 
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375 
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc 

so in binary 0.1 is 0.00011... 

但這是無止境的。 除了計算機必須停止在某個時刻。所以如果在我們的例子中,我們停在0.00011,我們有0.09375而不是0.1。

無論如何,重要的是,這並不取決於語言,但在計算機上。什麼取決於語言是你如何顯示數字。通常,語言將數字四捨五入爲可接受的表示形式。顯然JS沒有。

所以你必須做的(內存中的數字是足夠準確的)只是告訴JS在將它們轉換爲文本時舍入「很好」的數字。

您可以嘗試sprintf函數,該函數可以很好地控制如何顯示數字。

相關問題