关于javascript:另一个浮点问题

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

如您所见,打印a确实显示0.3,因为默认情况下,print四舍五入为6或7位十进制数字,而在提示处键入表达式(此处a是单变量表达式)时,会显示两倍以上数字的结果(从而显示浮点的固有限制)。

对于如何显示数字,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会悄悄地抑制末尾的错误位。有时不会。

    这就是原因。

    您拥有这两者的源代码。如果你想了解更多,你可以。然而,知道源代码并不会改变太多。