如何确定浮点数是否在Python中的特定范围内

时间:2012-09-26 04:31:41

标签: python floating-point python-3.x

为了确定输入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。我已经尝试了其他一些方法,但我无法摆脱这种舍入问题。

有人可以想办法吗?

2 个答案:

答案 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