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

时间:2014-08-23 20:31:04

标签: 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

5 个答案:

答案 0 :(得分:17)

你在寻找吗?

def check(value):
    if 0.50 <= value <= 150 and round(value,2)==value:
        return True
    return False

鉴于你的意见:

  

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

简单地说, 浮点值不精确。许多价值观没有精确的代表性。比如说1.40。它可能会显示&#34;因为它&#34;:

>>> f = 1.40
>>> print f
1.4

But this is an illusion。 Python已经舍入该值以便很好地显示它。变量f引用的实际值非常不同:

>>> from decimal import Decimal
>>> Decimal(f)
Decimal('1.399999999999999911182158029987476766109466552734375')

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

解决该问题的最简单方法可能是使用我在上面的代码中建议的round(...,2)。但这只是一种启发式 - 只能拒绝&#34;很大程度上是错误的&#34;值。请看我的观点:

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

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


作为最后的建议,根据您的问题,我猜测您的需求,您应该明确考虑使用&#34;十进制算术&#34;。 Python为此提供了decimal模块。

答案 1 :(得分:3)

float是您的案例使用的错误数据类型,请改用Decimal

检查python docs for issues and limitations。从那里引用(我已经用斜体来概括了文本)

  

浮点数在计算机硬件中表示为基数2(二进制)分数。

     

无论您愿意使用多少个2位数字,某些十进制值(如0.1)都不能完全表示为基数2分数。

     

停在任何有限数量的位上,你得到一个近似值

     

在运行Python的典型计算机上,Python浮点数有53位可用精度,因此输入十进制数时内部存储的值是二进制小数,它接近但不完全等于它。 / p>      

内置的round()函数的文档说它会舍入到最接近的值,从而将关系从零处四舍五入。

最后,建议

  

如果你处在一种情况,你关心你的十进制中途案例四舍五入,你应该考虑使用decimal模块。

这也适用于你的情况,因为你正在寻找小数点后2位数的精度,浮动只是不能保证。


编辑注:以下答案对应于与随机浮动生成相关的原始问题

看到你需要2位数的确定镜头精度,我建议在[50, 15000]范围内生成整数随机数并将它们除以100以将它们转换为浮动自己。

import random
random.randint(50, 15000)/100.0

答案 2 :(得分:2)

为什么不使用round

round(random.uniform(0.5, 150.0), 2)

答案 3 :(得分:1)

你想要做的不是改变价值本身。正如评论中Cyber所述,即使你的圆点是一个浮点数,它也总是存储相同的精度。如果您需要更改打印方式:

n = random.uniform(0.5, 150)
print '%.2f' % n               # 58.03

答案 4 :(得分:0)

最简单的方法是先将小数转换为字符串并用'。'分隔。并检查字符的长度。如果大于2,则继续。即转换使用输入数字以检查它是否在给定范围内。

a=15.22366
if len(str(a).split('.')[1])>2:
    if 0.50 <= value <= 150:
        <do your stuff>>