0

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

有人能想出办法吗?

4

2 回答 2

3

float在 Python 中使用值时,不可能实现完全准确的数字比较。这是因为浮点值在精度上固有地受到限制。

在您的示例中,该数字将具有与(如 nneonneo 在评论中提到的)1.5999999999999999999999相同的浮点表示。1.6可能更令您惊讶的是,浮点表示并不完全等于任何一个源数字(到小数点后 20 位,它是1.60000000000000008882)。Python 对您隐藏了一点,因为如果您将数字打印出来,1.6即使它稍微大一点,它也会显示出来。

最后的额外位是舍入误差,因为没有任何 1.6 的非重复二进制表示。就像三分之一只能用无限重复的十进制精确表示一样,1.6需要无限位数才能用二进制精确表示。该错误来自于在一定数量的数字后停止表示并将其余部分四舍五入(如表示1/30.333333,并将重复的 3 的其余部分四舍五入)。

有很多方法可以编写代码来减轻浮点错误的影响,但你不能让它们完全消失,除非,我想,在需要极高精度的情况下不使用浮点值. 在 Python 中,如果您想要更高的精度(以牺牲一些性能为代价),您可以改用标准库中的 Decimal 类:

from decimal import Decimal

d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")

print(d1 >= d2) # prints: False
于 2012-09-26T06:14:54.867 回答
0

当使用所有语言的浮点类型时,这是一个普遍的问题。如果您真的想知道机器上 Python 中使用的浮点数的精度,您可以使用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
于 2012-09-26T07:03:40.097 回答