我已经阅读了关于浮点的大部分帖子,我理解使用IEEE 754的基本问题(并且仅仅通过以二进制形式存储数字的性质)某些分数无法表示。我试图找出以下内容:如果Python和JavaScript都使用IEEE 754标准,为什么在Python中执行以下操作
.1 + .1
结果 0.20000000000000001(这是预期的)
在Javascript中(至少在Chrome和Firefox中)答案是.2
然而执行
.1 + .2
在两种语言中都有结果 0.30000000000000004
另外,执行 var a = 0.3;在JavaScript中打印结果 0.3
在Python中执行a = 0.3的结果为0.29999999999999999
我想了解这种行为差异的原因。
此外,OS上的许多帖子都链接到Java的BigDecimal的JavaScript端口,但链接已经死了。有人有副本吗?
答案 0 :(得分:6)
在Python中执行a = 0.3会导致 0.29999999999999999
不完全 - 观看:
>>> a = 0.3
>>> print a
0.3
>>> a
0.29999999999999999
如您所见,打印 ing a
确实会显示0.3
- 因为默认情况下print
会在输入表达式时将其舍入为6或7位小数(此处a
是单变量表达式)在提示符处显示结果的位数超过两倍(从而揭示浮点的内在限制)。
Javascript可能会有关于如何显示数字的略微不同的舍入规则,并且舍入的确切细节足以解释您观察到的差异。请注意,例如(在Chrome javascript控制台上):
> (1 + .1) * 1000000000
1100000000
> (1 + .1) * 100000000000000
110000000000000.02
见?如果你设法看到更多数字,异常(不可避免地 那里)也会变得可见。
答案 1 :(得分:3)
并打印。
它们可能都具有相同的IEEE 754底层表示,但这并不意味着它们被迫以相同的方式打印。当差异足够小时,看起来Javascript正在舍入输出。
对于浮点数,重要的部分是二进制数据的结构,而不是它在屏幕上显示的内容。
答案 2 :(得分:0)
我想了解这种行为差异的原因。
他们是不同的语言。
他们使用不同的底层包。
他们有不同的实现。
当你说“Python”时 - 你在谈论哪种实现? C,Jython,IronPython?你有没有比较过这些?
Javascript人员似乎处理重复的二进制分数与Python人员处理重复二进制分数的方式不同。
有时Javascript会在最后悄悄地抑制错误位。有时它没有。
这就是原因。
您拥有两者的源代码。如果你想了解更多,你可以。但是,了解源代码并没有太大变化。