为什么 0.3 + 0 == 0.3 和 0.1 + 0 == 0.1 在 javascript 中,0.3 和 0.1 不能精确地用二进制表示

run*_*ror 4 javascript floating-point precision numbers ieee-754

第一个问题:如果我们这样做的话,在java脚本中。

0.2 + 0.1
=>0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

因为 0.2,0.1 被四舍五入到不同的数字,并且总和也被四舍五入到不同的数字。 这篇文章解释了幕后的情况。我理解这一点,但是当我这样做时。

0.3 + 0
=>0.3  
Run Code Online (Sandbox Code Playgroud)

为什么显示0.3?0.3 不能用二进制正确表示,应该四舍五入到不同的数字,对吗?
所以 0.3 + 0 的值应该是 0.3 的四舍五入数和总和(如果需要)?

第二个问题:
我们什么时候做。

let x = 0.3
Run Code Online (Sandbox Code Playgroud)

由于 0.3 无法用二进制精确表示,因此它会四舍五入到另一个数字,但是当您访问变量 x 时,为什么它显示 0.3 而不是实际四舍五入的数字。

x
=>0.3
Run Code Online (Sandbox Code Playgroud)

但当你这样做的时候。

0.2 + 0.1
=>0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

它显示实际的四舍五入数字,但不是 0.3。请解释一下。

T.J*_*der 5

0.1添加和时得到的值0.2和从文字中得到的值0.3不同的值(两者都不是精确的 3/10,两者都非常接近)。(相加0并不重要,它不会改变要相加的数字的值。)您得到的值0.1 + 0.2刚刚超过3/10;你得到的0.3(如果我没记错的话)不到3/10

将浮点数转换为文本时,JavaScript 遵循通常的做法,即仅包含所需数量的数字,以将其与该格式可以表示的下一个最接近的值区分开来(详细信息请参阅规范规范引用的学术论文)。0.3不需要任何额外的数字来进行区分,但0.30000000000000004确实需要(我猜想将其与 区分开来0.3,但我实际上并不知道)。