Why 0.1 + 0.2 === 0.30000000000000004 ?

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

相关文章
相关标签/搜索