为了确定输入x是否在1.6和1.9之内,我尝试了以下内容:
def function(x)
if(x >= 1.6 & x <= 1.9):
return True
else
return False
这里的问题是当你输入一个非常接近1.6或1.9的数字时,这不能正常工作。例如。 1.5999999999999999999999将被评估为1.6,因此即使函数不在范围(1.6 - 1.9)内,函数也会返回True。我已经尝试了其他一些方法,但我无法摆脱这种舍入问题。
有人可以想办法吗?
答案 0 :(得分:3)
在Python中使用float
值时,无法实现完全准确的数字比较。这是因为浮点值的精度本身就受到限制。
在您的示例中,数字1.5999999999999999999999
将具有与1.6
相同的浮点表示(如评论中的nneonneo所述)。更令你惊讶的是,浮点表示不完全等于任一源数(到20位小数,它是1.60000000000000008882
)。 Python会隐藏这一点,因为如果你输出数字,它会显示1.6
,即使它稍微大一点。
最后的额外位是舍入误差,因为没有任何1.6的非重复二进制表示。就像三分之一只能通过无限重复的十进制来精确表示一样,1.6
需要无限多的位来精确地表示二进制。错误来自于在一定数量的数字后停止表示并将其余数字四舍五入(如将1/3
表示为0.333333
,并将其余的重复3舍入为止。)
有许多方法可以编写代码来减轻浮点错误的影响,但是你不能让它们完全消失,除了我想,通过在非常高的情况下不使用浮点值精度是必需的。在Python中,如果您想要更高的精度(以某些性能为代价),您可以使用标准库中的Decimal类:
from decimal import Decimal
d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")
print(d1 >= d2) # prints: False
答案 1 :(得分:0)
使用所有语言的float类型时,这是一般问题。如果您真的想知道机器上Python中使用的float的精度,可以使用sys.float_info.epsilon
- 请参阅http://docs.python.org/library/sys.html#sys.float_info。它在我的案例中显示以下内容:
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16