为什么ipython3显示重复小数而不是实际值?

时间:2018-04-15 19:07:32

标签: python python-3.x ipython

简单计算,如

1-0.92*0.9

我的ipython3给出了结果

0.17199999999999993

而不是0.172 ??

1 个答案:

答案 0 :(得分:0)

iPython使用 64位浮点算法。但是,浮点算法实际上是二进制的,内部用1和0表示。

浮点算术不能确切地确定像0.90.92那样简单的事情,这意味着您仍然有舍入错误。 这是重复/重复小数的二进制等值。唯一的解决方法是将这些小数表示为精确分数或使用任意精度或定点库:https://docs.python.org/3/library/fractions.html

实际上,浮点运算只能精确地表达一些非整数x,这些数字可以x = a/b的形式表示,其中a,b最低,{{1 }是整数,a, bb 2的幂。它不能精确地表示十分之一,或者分母1是五的倍数,或者除了1或2之外的任何数字。这很像是最低分数b无法准确表示为如果a/b包含b2以外的任何其他因素,则为小数。

此外,你必须记住最重要和最不重要的价值观:它们不能相隔太远:5作为双倍会掉落最右边(最不重要)1。

以下是一些例子:

  • 100 = 100/1。 1.000000000000000000000001为1,表示100是不可或缺的。 100完全代表。
  • 0.5 = 1/2。 b是2. 0.5是完全代表的。
  • 0.125 = 1/8。 b是2的幂。正好表示了0.125。
  • 0.9 = 9/10。 b是10,是5.的倍数.0.9无法准确表示。
  • 0.92 = 41/50。 b是50,是5. 0.92的倍数也无法准确表示。

有关详细信息,请参阅Is Floating Point Math broken?