0.1+0.2 !=0.3
在 js 中 0.1 + 0.2 != 0.3 而是输出 : 0.30000000000000004 ,这是为什么呢?
在计算机执行计算的时候,需要把十进制转换成二进制,执行计算,计算完成后输出。
我们分析一下 0.1 的二进制, 0 是整数位,1 是小数位。
整数转换二级制的流程:
当前位值 * 2^(n-1) 1010 = 1* 2^3 +0*2^2 +12^1+02^0 = 10
parseInt('1010', 2); // 10
小数部分转二级制流程: 把当前位不停*2 取整 0.1 转换成二进制 0.1 * 2 = 0.2 无整数 二进制为:0.0 0.2 * 2 = 0.4 无整数 二进制为:0.00 0.4 * 2 = 0.8 无整数 二进制为:0.000 0.8 * 2 = 0.6 取 1 余 0.6 二进制为:0.0001 0.6 * 2 = 0.2 取 1 余 0.2 二进制为:0.00011 0.2 * 2 = 0.4 无整数 二进制为:0.000110 无限循环.... 所有 0.1 转换二进制是无限循环的:0.00110011001100110011.... 在计算机取值双精度浮点数(可以理解为四舍五入)取值为如下:
0.0001100110011001100110011001100110011001100110011001101
同理 0.2 转成二级制是
0.001100110011001100110011001100110011001100110011001101
0.1 + 0.2 的二级制 相加得到二级制结果是: 0.0100110011001100110011001100110011001100110011001100111 输出 十进制:
parseInt('0.0100110110010100110011001100110011001100110011001100111', 2); 这个不支持小数 可以使用这个网站校验: tool.oschina.net/hexconvert/ 输出: 0.30000000000000004
所有 0.1+ 0.2 !=0.3
转换成二级制可以通过 实现 (0.1).toString(2) (0.2).toString(2)