为什么直接赋值适用于 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 3。 0x3FD3333333333334
是:
.300000000000000044408920985006...
同样,您不能将 0.30000000000000002 用于直接赋值或直接记录,因为它介于两个位之间,解释器必须选择一个:
console.log(0.30000000000000002);
考虑一个简单的代码片段:
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 3。 0x3FD3333333333334
是:
.300000000000000044408920985006...
同样,您不能将 0.30000000000000002 用于直接赋值或直接记录,因为它介于两个位之间,解释器必须选择一个:
console.log(0.30000000000000002);