如何在Python中确定浮点值是否在特定范围内
为了确定输入x是否在1.6和1.9范围内,我尝试了以下方法:如何在Python中确定浮点值是否在特定范围内,python,floating-point,python-3.x,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 def函数(x) 如果(x>=1.6&x,在Python中使用float值时,不可能实现完全精确的数字比较。这是因为浮点值固有的精度限制 在您的示例中,数字1.5999999999999999999将具有与1.6相同的
def function(x)
if(x >= 1.6 & x <= 1.9):
return True
else
return False
def函数(x)
如果(x>=1.6&x,在Python中使用float
值时,不可能实现完全精确的数字比较。这是因为浮点值固有的精度限制
在您的示例中,数字1.5999999999999999999
将具有与1.6
相同的浮点表示形式(如nneonneo在评论中所述)。更让您惊讶的是,浮点表示形式与两个源数字都不完全相同(小数点后20位为1.600000000000008882
)。Python对您隐藏了一点,因为如果您打印出数字,它将显示1.6
,即使它稍微大一点
末尾的额外位是舍入错误,因为没有任何1.6的非重复二进制表示。就像三分之一只能由无限重复的十进制表示一样,1.6
需要无限个位才能以二进制表示。错误来自于在cer后停止表示t位数并将其余的位数四舍五入(如将1/3
表示为0.333333
,并将其余重复的3位数四舍五入)
有很多方法可以编写代码来减轻浮点错误的影响,但不能完全消除它们,除非在需要极高精度的情况下不使用浮点值您可以改为使用标准库中的Decimal类:
from decimal import Decimal
d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")
print(d1 >= d2) # prints: False
在Python中使用float
值时,不可能实现完全精确的数字比较。这是因为浮点值本身在精度上是有限的
在您的示例中,数字1.5999999999999999999
将具有与1.6
相同的浮点表示形式(如nneonneo在评论中所述)。更让您惊讶的是,浮点表示形式与两个源数字都不完全相同(小数点后20位为1.600000000000008882
)。Python对您隐藏了一点,因为如果您打印出数字,它将显示1.6
,即使它稍微大一点
末尾的额外位是舍入错误,因为没有任何1.6的非重复二进制表示。就像三分之一只能由无限重复的十进制表示一样,1.6
需要无限个位才能以二进制表示。错误来自于在cer后停止表示t位数并将其余的位数四舍五入(如将1/3
表示为0.333333
,并将其余重复的3位数四舍五入)
有很多方法可以编写代码来减轻浮点错误的影响,但不能完全消除它们,除非在需要极高精度的情况下不使用浮点值您可以改为使用标准库中的Decimal类:
from decimal import Decimal
d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")
print(d1 >= d2) # prints: False
在所有语言中使用浮点类型时,这是一个常见问题。如果您真的想知道计算机上Python中使用的浮点类型的精度,可以使用sys.float\u info.epsilon
——请参阅。在我的例子中,它显示了以下内容:
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
在所有语言中使用浮点类型时,这是一个常见问题。如果您真的想知道计算机上Python中使用的浮点类型的精度,可以使用sys.float\u info.epsilon
——请参阅。在我的例子中,它显示了以下内容:
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
请注意,1.59999999999999999999
实际上将等于1.6
,因为float
数据类型的精度有限。@MarkDickinson:没错。代码应该缩短为:返回1.6请注意,1.59999999999999999999
实际上将等于1.6
他限制了float
数据类型的精度。@MarkDickinson:没错。代码应该缩短为:return 1.6,但这并不是全部。虽然这是Pythonfloat
中最小的可表示数字,但在处理较大数字之间的差异时,仍然会遇到问题。例如,100000000000000.0+1==100000000000000.0
是真的
+1是的。有足够多的事情让人停下来思考准确性。有时最好用术语来思考这就足够了。:)这并不是全部。虽然这是Python中最小的可表示数字float
,但当你处理较大数字之间的差异时,你仍然会遇到问题。例如,100000000000000.0+1==1000000000000000.0
是真的
+1是的。有足够多的事情可以解决让我们停下来想一想精确性。有时最好是用这样的术语来思考,这就足够了