数字
灵魂一问:
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