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

标签 javascript floating-point numbers precision ieee-754

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

0.2 + 0.1
=>0.30000000000000004

因为 0.2、0.1 被四舍五入为不同的数字,并且总和也被四舍五入为不同的数字 This article explains the behind the scenes .我明白这一点但是 当我这样做的时候。

0.3 + 0
=>0.3  

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

第二个问题:
当我们这样做的时候。

let x = 0.3

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

x
=>0.3

但是当你这样做的时候。

0.2 + 0.1
=>0.30000000000000004

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

最佳答案

添加 0.1 时得到的值和 0.2以及您从文字中获得的值 0.3不同的值(两者都不正好是 3/10,两者都非常接近)。 (添加 0 无关紧要,它不会更改添加到的数字的值。)您从 0.1 + 0.2 获得的那个刚刚超过 3/10;你从0.3得到的那个(如果我没记错的话)不到 3/10ths。

在将 float 转换为文本时,JavaScript 遵循通常的做法,即仅包含所需数量的数字,以将其与格式可以表示的下一个最接近的值区分开来(详情 in the specthe academic paper the spec references )。 0.3不需要任何额外的数字来区分,但是 0.30000000000000004确实(我猜想将它与 0.3 区分开来,但我实际上并不知道)。

关于javascript - 为什么 0.3 + 0 == 0.3 和 0.1 + 0 == 0.1 在 javascript 中,而 0.3 和 0.1 不能用二进制精确表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71108587/

相关文章:

javascript - IE8 javascript/jQuery 中的 undefined variable

javascript - 选择列表 - 多项选择 - Google 电子表格

c++ - 如何在 C++11 constexpr 中检查 double 的位模式是 0x0?

algorithm - 如何在不转换的情况下检查不以 10 为基数的数字的整除性?

javascript - 如何将带有适当逗号的数字四舍五入到小数点后两位?

javascript - 测试字符串是否是 JavaScript 中的有效 float

javascript - 在 JavaScript 对象字面量中,我应该引用 'this' 还是变量名?

javascript - 如果比较(if 语句)比较未定义的值,则返回 true

c++ - 添加两个对数时防止下溢

r - 将浮点精度添加到qnorm/pnorm吗?