Why 0.1 + 0.2 === 0.30000000000000004 ?網站
在浮點數運算中產生偏差值的示例中,最出名應該是0.1 + 0.2 === 0.30000000000000004了,到底有多有名?看看這個網站就知道了http://0.30000000000000004.com/。也就是說不只是JavaScript會產生這種問題,只要是採用IEEE 754 Floating-point的浮點數編碼方式來表示浮點數時,則會產生這類問題。下面咱們來分析整個運算過程。編碼
1. 0.1 的二進制表示爲 1.1001100110011001100110011001100110011001100110011001 1(0011)+ * 2^-4;spa
2. 當64bit的存儲空間沒法存儲完整的無限循環小數,而IEEE 754 Floating-point採用round to nearest, tie to even的舍入模式,所以0.1實際存儲時的位模式是0-01111111011-1001100110011001100110011001100110011001100110011010;rest
3. 0.2 的二進制表示爲 1.1001100110011001100110011001100110011001100110011001 1(0011)+ * 2^-3;blog
4. 當64bit的存儲空間沒法存儲完整的無限循環小數,而IEEE 754 Floating-point採用round to nearest, tie to even的舍入模式,所以0.2實際存儲時的位模式是0-01111111100-1001100110011001100110011001100110011001100110011010;ip
5. 實際存儲的位模式做爲操做數進行浮點數加法,獲得 0-01111111101-0011001100110011001100110011001100110011001100110100。轉換爲十進制即爲0.30000000000000004。get
意義it
1位用來表示符號位
11位用來表示指數
52位表示尾數
循環
浮點數,好比二進制
0.1 >> 0.0001 1001 1001 1001…(1001無限循環)
0.2 >> 0.0011 0011 0011 0011…(0011無限循環)