如何检查浮点值是否在范围内(0.50,150.00)并且有2位小数?
例如,15.22366应为false(十进制数字太多)。但是15.22应该是真的。
我尝试过类似的事情:
data= input()
if data in range(0.50,150.00):
return True
答案 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>>