为什么直接赋值适用于 Javascript 数字数据类型时加法会丢失精度?

Why addition lose precision when direct assignment works for Javascript number data type?

考虑一个简单的代码片段:

let a = 0.1;
let b = 0.2;
let c = 0.3;
let d = a + b;

console.log(c.toString()); //0.3
console.log(d.toString()); //0.30000000000000004

我能找到的解释是0.3不能用双精度浮点数精确表示。但如果那是真的,在直接赋值的情况下,c如何保持值0.3而不丢失精度

两者都无法准确表示。使用 this converter 看看发生了什么。

JavaScript 数字表示为双精度 64 位数字 (IEEE754)

0.3单独gets interpreted as0x3FD3333333333333,也就是说,如果你手头计算:

.299999999999999988897769753748...

显示为小数时,四舍五入为 0.3。这并不是说存储的值正好等于 0.3(如果您尝试用它进行更多计算就可以显示),而是在显示时显示为 0.3 - 它比下一位更接近 3,在 2.9999999999999993.

0.1 + 0.2 稍微偏离 - 最后一位(十六进制)is 4, not 30x3FD3333333333334 是:

.300000000000000044408920985006...

同样,您不能将 0.30000000000000002 用于直接赋值或直接记录,因为它介于两个位之间,解释器必须选择一个:

console.log(0.30000000000000002);