max()没有返回正确的最大数字

时间:2015-07-29 06:07:56

标签: python floating-point

我使用以下代码找出这两个数字中的哪一个具有最大值:

maximum = max(2.3,2.300000000001) 
print maximum

但我获得的输出是2.3而不是2.300000000001。任何人都可以解释为什么会这样吗?

5 个答案:

答案 0 :(得分:7)

不要担心 - max没有被破坏,maximum确实拥有2.300000000001。但是,print会在打印时对其进行舍入。您可以使用repr来证明:

>>> maximum = max(2.3,2.300000000001) 
>>> print maximum
2.3
>>> print repr(maximum)
2.300000000001

答案 1 :(得分:4)

来自the doc

  

<强> 14。浮点算术:问题和限制

     

很容易忘记存储的值是近似值   原始小数部分,因为浮动的方式   在翻译提示下显示。 Python只打印一个小数   逼近二进制近似的真实十进制值   由机器存储。如果Python要打印真正的十进制值   对于存储为0.1的二进制近似值,它必须显示

     

>>> 0.1

     

0.1000000000000000055511151231257827021181583404541015625

     

这比大多数人认为有用的数字更多,所以Python保留了   通过显示舍入值代替

可管理的位数      

>>> 0.1

     

0.1

答案:你得到的结果很好,但print对它进行了解决。

您可以使用repr()检查实际值:

maximum = max(2.3,2.300000000001) 
print repr(maximum)

答案 2 :(得分:1)

Python print命令会自动截断数字。上面的评论中有一些解释。如果您希望它打印完整值,请尝试使用print "%13f" % maximum向您显示完整值

答案 3 :(得分:1)

在你的情况下,正如mureinik所说,只有印刷才是问题的原因。更直接的示范是:

>>> a = 2.300000000001
>>> a
2.300000000001
>>> print(a)
2.3

但要注意,Python使用其平台的底层浮点,并且它没有一个无限的准确性。根据经验,只有16位十进制数字是准确的:

>>> b = 2.300000000000000001
>>> b
2.3
>>> c = 2.3
>>> b == c
True

答案 4 :(得分:0)

“绝对或相对差异”检查由等效于以下Python代码的代码实现:(https://code.google.com/codejam/apactest/faq.html#case_1

def IsApproximatelyEqual(x, y, epsilon):
  """Returns True iff y is within relative or absolute 'epsilon' of x.

  By default, 'epsilon' is 1e-6.
  """
  # Check absolute precision.
  if -epsilon <= x - y <= epsilon:
    return True

  # Is x or y too close to zero?
  if -epsilon <= x <= epsilon or -epsilon <= y <= epsilon:
    return False

  # Check relative precision.
  return (-epsilon <= (x - y) / x <= epsilon
       or -epsilon <= (x - y) / y <= epsilon)

检查这件事也很好。 当python出现输出时,在处理实数时会有一些无知的范围。