如何检查浮点值是否在一定范围内并且具有给定的小数位数?

use*_*581 8 python floating-point

如何检查浮点值是否在一个范围内(0.50,150.00)并且有2位小数?

例如,15.22366应为false(十进制数字太多).但是15.22应该是真的.

我尝试过类似的东西:

data= input()
if data in range(0.50,150.00):
   return True
Run Code Online (Sandbox Code Playgroud)

Syl*_*oux 17

那是你在找?

def check(value):
    if 0.50 <= value <= 150 and round(value,2)==value:
        return True
    return False
Run Code Online (Sandbox Code Playgroud)

鉴于你的评论:

我输入15.22366它将返回true; 这就是我指定范围的原因; 它应该接受15.22

简单地说,浮点值是不精确的.许多值没有精确的表示.比如说1.40.它可能会显示为"as it":

>>> f = 1.40
>>> print f
1.4
Run Code Online (Sandbox Code Playgroud)

但这是一种幻觉.Python已经舍入该值以便很好地显示它.变量引用的实际值f非常不同:

>>> from decimal import Decimal
>>> Decimal(f)
Decimal('1.399999999999999911182158029987476766109466552734375')
Run Code Online (Sandbox Code Playgroud)

根据你的规则只有2位小数,是否应该f引用有效值?

修复该问题的最简单方法可能是round(...,2)按照我在上面的代码中的建议使用.但这仅仅是一种启发式 - 只能拒绝"很大程度上错误"的价值观.请看我的观点:

>>> for v in [ 1.40,
...            1.405,
...            1.399999999999999911182158029987476766109466552734375,
...            1.39999999999999991118,
...            1.3999999999999991118]:
...     print check(v), v
...
True 1.4
False 1.405
True 1.4
True 1.4
False 1.4
Run Code Online (Sandbox Code Playgroud)

注意最初的几个结果最初可能会令人惊讶.我希望我的上述解释对此有所启发.


作为最后的建议,根据你的问题,我猜测你的需求,你应该明确地考虑使用"十进制算术".Python 为此提供了十进制模块.