Another floating point question
我已经阅读了这里关于浮点的大部分文章,并且我理解了使用IEEE754(并且仅仅通过二进制存储数字的性质)某些分数无法表示的基本问题。我试图弄明白以下几点:如果python和javascript都使用IEEE754标准,为什么要在python中执行以下内容?
.1+.1
结果0.2000000000001(预计)
在javascript(至少在chrome和firefox中)中,答案是。
无论表现如何
.1+.2
两种语言的结果是30亿
此外,执行var a=0.3;在javascript中,打印结果零点三
其中,在python中,a=0.3会导致0.2999999999999
我想了解这种行为差异的原因。
此外,OS上的许多帖子链接到Java的BigDeCimple的JavaScript端口,但是链接已经死了。有人有副本吗?
doing a = 0.3 in Python results in
0.29999999999999999
号
不完全是——看:
1 2 3 4 5 | >>> a = 0.3 >>> print a 0.3 >>> a 0.29999999999999999 |
如您所见,打印
对于如何显示数字,JavaScript可能有稍微不同的舍入规则,并且舍入的确切细节足以解释您观察到的差异。注意,例如(在chrome javascript控制台上):
1 2 3 4 | > (1 + .1) * 1000000000 1100000000 > (1 + .1) * 100000000000000 110000000000000.02 |
号
看到了吗?如果你能看到更多的数字,这些异常(不可避免的)也会变得明显。
and printing.
号
它们可能都有相同的IEEE754底层表示,但这并不意味着它们必须以相同的方式打印。当差异足够小时,看起来javascript正在舍入输出。
对于浮点数,重要的部分是二进制数据的结构,而不是它在屏幕上显示的内容。
I would like to understand the reason for this difference in behavior.
号
它们是不同的语言。
它们使用不同的底层包。
它们有不同的实现。
当你说"python"时——你在说什么实现?C,Jython,铁蟒?你比较了每一个吗?
JavaScript人员处理重复二进制分数的方式似乎与Python人员处理重复二进制分数的方式不同。
有时,javascript会悄悄地抑制末尾的错误位。有时不会。
这就是原因。
您拥有这两者的源代码。如果你想了解更多,你可以。然而,知道源代码并不会改变太多。