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无限循环)