另一个浮点问题

时间:2010-06-15 20:43:35

标签: javascript python floating-point

我已经阅读了关于浮点的大部分帖子,我理解使用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端口,但链接已经死了。有人有副本吗?

3 个答案:

答案 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)

  

我想了解这种行为差异的原因。

  1. 他们是不同的语言。

  2. 他们使用不同的底层包。

  3. 他们有不同的实现。

  4. 当你说“Python”时 - 你在谈论哪种实现? C,Jython,IronPython?你有没有比较过这些?

    Javascript人员似乎处理重复的二进制分数与Python人员处理重复二进制分数的方式不同。

    有时Javascript会在最后悄悄地抑制错误位。有时它没有。

    这就是原因。

    您拥有两者的源代码。如果你想了解更多,你可以。但是,了解源代码并没有太大变化。