在js中為什麼0 1 0 2不等於0 3

2021-09-01 15:27:38 字數 649 閱讀 5890

0.1+0.2==0.3

// false

原因在於在js中採用的ieee 754的雙精度標準,計算機內部儲存資料的編碼的時候,0.1在計算機內部根本就不是精確的0.1,而是乙個有捨入誤差的0.1。當**被編譯或解釋後,0.1已經被四捨五入成乙個與之很接近的計算機內部數字,以至於計算還沒開始,乙個很小的捨入錯誤就已經產生了。這也就是 0.1 + 0.2 不等於0.3 的原因。

另外要注意,不是所有浮點數都有捨入誤差。二進位制能精確地表示位數有限且分母是2的倍數的小數,比如0.5,0.5在計算機內部就沒有捨入誤差。所以0.5 + 0.5 === 1

有時兩個近似值進行計算的時候,得到的值是在js的近似範圍內的,於是就可以得到正確答案。至於哪些值計算後能得到正確結果,哪些不能,我們也不需要去記。

如何避免這樣的問題?

最好的方法就是我們想辦法規避掉這類小數計算時的精度問題就好了,那麼最常用的方法就是將浮點數轉化成整數計算。因為整數都是可以精確表示的。

通常的解決辦法 就是 把計算數字 提公升 10 的n次方 倍 再 除以 10的n次方。一般都用 1000 就行了。

(0.1*1000+0.2*1000)/1000==0.3

//true

為什麼0 1 0 2不等於0 3

先看兩個簡單但詭異的 0.1 0.2 0.3 true 0.1 0.1 0.0100000000000000020.1加0.2為什麼就不等於0.3暱?要回答這個問題,得先了解計算機內部是如何表示數的。我們都知道,計算機用位來儲存及處理資料。每乙個二進位制數 二進位制串 都一一對應乙個十進位制數。1....

46 為什麼 NaN 不等於自身?

nan,它是用來表示是否屬於number型別的一種狀態 是或否。而不是乙個確切的值。nan值一般會在什麼情況下出現呢?一般有兩種情況 1 乙個表示式中如果有減號 乘號 或 除號 等運算子時,js引擎會在計算之前試圖將運算子兩邊的變數轉化為number型別,如果轉化失敗,表示式將返回nan 2 直接使...

專案管理 付出為什麼不等於收穫?

有些人付出很多但收穫很少,也有些人付出很少卻獲益多多。這不符合古人所謂 天道酬勤 也不符合今人所言 能量守恆 好像無論從社會科學還是自然科學的角度,付出都應該等於收穫。為什麼我們看到的現象與此不符?那是因為我們忽略或者沒有看到其中的隱藏因素。如果用公式來表達付出與收穫之間的關係,應該是下面兩個公式 ...