我使用以下代码找出这两个数字中的哪一个具有最大值:
maximum = max(2.3,2.300000000001)
print maximum
但我获得的输出是2.3
而不是2.300000000001
。任何人都可以解释为什么会这样吗?
答案 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出现输出时,在处理实数时会有一些无知的范围。