数字

灵魂一问:

const num = 0.1 + 0.2
console.log(num)
// 0.30000000000000004

Why?

计算机里所有的数据最终都是以二进制保存的,当然数字也一样. 所以当计算机计算0.1+0.2的时候,实际上计算的是这两个数字在计算机里所存储的二进制.

0.1 二进制表达:0.000110011001100110011001100110011001100110011001100...(1100循环) 0.2 二进制表达:0.00110011001100110011001100110011001100110011001100... (1100循环)

我们发现,它们都是无限循环的二进制。显然,计算机当然不会用自己“无限的空间”去存储这些无限循环的二进制数字。那对于这类数据该怎么办?

JS如何处理无限循环的二进制数字

JavaScript中所用的数字包括整数和小数,都只有一种类型就是Number,它的实现遵循IEEE 754标准. 使用64位固定长度来表示,也就是标准的double双精度浮点数(相关的还有float 32位单精度); 我们只需要知道,在二进制科学表示法中, 双精度浮点的小数部分最多只能保留52位(比如1.xxx...*2^n,这里x最多保留52位)加上前面的1,其实就是保留53位有效数字,剩余的舍去,遵从“0舍1入”,

0.1二进制舍弃后

0.00011001100110011001100110011001100110011001100110011010

0.2二进制舍弃后

0.0011001100110011001100110011001100110011001100110011010

二者相加:

0.0100110011001100110011001100110011001100110011001100111

转为10进制 => 0.30000000000000004

参考

上次更新:
贡献者: liuzhu