另一个浮点问题

jef*_*max 5 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端口,但链接已经死了.有人有副本吗?

Ale*_*lli 6

在Python中执行a = 0.3会导致0.29999999999999999

不完全 - 看:

>>> a = 0.3
>>> print a
0.3
>>> a
0.29999999999999999
Run Code Online (Sandbox Code Playgroud)

正如所看到的,打印 ING a确实显示0.3-因为默认print轮6张或7位十进制数,在打字时的表达(在此a在提示符是单变量表达式)示出了具有在尽可能多的位数的两倍的结果(从而揭示浮点的内在局限性).

Javascript可能有关于如何显示数字的略微不同的舍入规则,并且舍入的确切细节足以解释您观察到的差异.请注意,例如(在Chrome javascript控制台上):

> (1 + .1) * 1000000000
  1100000000
> (1 + .1) * 100000000000000
  110000000000000.02
Run Code Online (Sandbox Code Playgroud)

看到?如果你设法看到更多的数字,异常(这必然有)变得可见了.