如何检查浮点数是否在特定范围内且具有指定小数位数?
如何检查一个浮点数值是否在范围(0.50, 150.00)内,并且小数点后有2位数字?
比如说,15.22366 应该返回 false(因为小数位数太多了)。但是 15.22 应该返回 true。
我尝试了类似这样的代码:
data= input()
if data in range(0.50,150.00):
return True
5 个回答
最简单的方法是先把小数转换成字符串,然后用 '.' 来分开,接着检查分开的部分长度。如果长度大于2,就可以继续处理。也就是说,先把输入的数字转换一下,看看它是否在指定的范围内。
a=15.22366
if len(str(a).split('.')[1])>2:
if 0.50 <= value <= 150:
<do your stuff>>
你可能想做的不是改变数值本身。正如Cyber在评论中提到的,即使你把一个浮点数四舍五入,它依然会保持原来的精度。如果你想改变它的显示方式:
n = random.uniform(0.5, 150)
print '%.2f' % n # 58.03
你为什么不直接用 round
呢?
round(random.uniform(0.5, 150.0), 2)
你用的 float
数据类型不太合适,建议用 Decimal
。
可以查看一下 Python 文档,了解浮点数的问题和限制。这里面有一句话我简单总结了一下:
浮点数在计算机里是用二进制(基数2)的小数来表示的。
不管你愿意用多少个二进制位,有些十进制的值(比如 0.1) 是无法精确表示成二进制的小数的。
如果你只用有限的位数,就只能得到一个近似值。
在普通的运行 Python 的机器上,Python 的浮点数有 53 位的精度,所以当你输入一个十进制数字时,内部存储的其实是一个接近但不完全相等的二进制小数。
内置的 round() 函数的文档说明,它会四舍五入到最近的值,并且在遇到相等的情况时会远离零进行舍入。
最后,文档建议:
如果你在乎你的十进制数在四舍五入时的处理方式,应该考虑使用 decimal 模块。
这对你来说也是适用的,因为你需要小数点后两位的精度,而 float
是无法保证这一点的。
编辑说明:下面的回答是针对原始问题,关于随机浮点数生成的。
既然你需要两位的精确值,我建议你生成范围在 [50, 15000]
的整数随机数,然后再除以 100
来自己转换成浮点数。
import random
random.randint(50, 15000)/100.0
你在找的就是这个吗?
def check(value):
if 0.50 <= value <= 150 and round(value,2)==value:
return True
return False
根据你的评论:
我输入15.22366,它会返回true;这就是我指定范围的原因;它应该接受15.22。
简单来说,浮点数的值是不精确的。很多值没有精确的表示方式。比如说1.40
,它可能会被显示成“这样”:
>>> f = 1.40
>>> print f
1.4
但这只是一个假象。Python为了好看而把这个值进行了四舍五入。变量f
所代表的真实值其实是完全不同的:
>>> from decimal import Decimal
>>> Decimal(f)
Decimal('1.399999999999999911182158029987476766109466552734375')
根据你只允许有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
注意最后几个结果一开始可能会让人感到惊讶。希望我上面的解释能让你明白一些。
最后的建议是,根据我从你的问题中猜测的需求,你绝对应该考虑使用“十进制运算”。Python提供了decimal模块来实现这个目的。