我已经阅读了这里关于 float 的大部分帖子,并且我理解使用 IEEE 754(并且只是由于以二进制形式存储数字的性质)无法表示某些分数的基本潜在问题。我想弄清楚以下内容:如果 Python 和 JavaScript 都使用 IEEE 754 标准,为什么要在 Python 中执行以下内容
.1 + .1
结果 0.20000000000000001(这是预期的)
在 Javascript 中(至少在 Chrome 和 Firefox 中)答案是 .2
无论表现如何
.1 + .2
两种语言的结果都是 0.30000000000000004
此外,执行 变量 a = 0.3;在 JavaScript 中打印结果 0.3
在 Python 中执行 a = 0.3 结果为 0.29999999999999999
我想了解造成这种行为差异的原因。
此外,OS 上的许多帖子都链接到 Java 的 BigDecimal 的 JavaScript 端口,但该链接已失效。有人有副本吗?
最佳答案
doing a = 0.3 in Python results in 0.29999999999999999
不完全——看:
>>> a = 0.3
>>> print a
0.3
>>> a
0.29999999999999999
如您所见,printing a
确实显示 0.3
-- 因为默认情况下 print
舍入为 6或 7 位十进制数字,同时在提示符下键入表达式(此处 a
是单变量表达式)显示结果的位数超过两倍(因此揭示了 float 的内在限制)。
关于如何显示数字,Javascript 的舍入规则可能略有不同,舍入的具体细节足以解释您观察到的差异。请注意,例如(在 Chrome javascript 控制台上):
> (1 + .1) * 1000000000
1100000000
> (1 + .1) * 100000000000000
110000000000000.02
看到了吗?如果您设法看到更多数字,异常(不可避免地存在)也会变得可见。
关于javascript - 另一个 float 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048865/