zxdfe / FE-Interview

Every step counts
34 stars 1 forks source link

第29题:为什么0.1 + 0.2 != 0.3 ? #30

Open zxdfe opened 1 year ago

Moooodena commented 1 year ago

精度丢失...

stevenhuanghr commented 1 year ago

计算机的储存方式是二进制的,0.1和0.2在进行二进制转换时会无限循环

Cremei commented 1 year ago

JavaScript 采用“遵循 IEEE 754 标准的双精度 64 位格式”表示数字。在 JavaScript(除了BigInt)当中,并不存在整数/整型 (Integer)。

console.log(3 / 2);             // 1.5,not 1
console.log(Math.floor(3 / 2)); // 1

↓看上去是整数,其实是浮点数

0.1 + 0.2 = 0.30000000000000004 // MDN给的例子
ttizzyf commented 1 year ago

在js中0.1和0.2都是采用二进制浮点数来表示的,这意味着它们在计算机中存储的是小数点后面有多位小数的二进制数 在进行计算时0.1在二进制中是无限循环小数,0.2也是如此,所以在进行计算时,无限循环小数相加会出现精度缺失的情况,导致它们相加的结果并不完全等于0.3。 这就是由于计算机的浮点数运算实现方式导致的,这种误差称为“舍入误差”。 在js中我们可以通过BigInt或者将0.1×10与0.2×10后相加再%100得出。整数相加并不会出现精度缺失的情况。