如何检查浮点数是否在特定范围内且具有指定小数位数?

14 投票
5 回答
78893 浏览
提问于 2025-04-18 18:18

如何检查一个浮点数值是否在范围(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

最简单的方法是先把小数转换成字符串,然后用 '.' 来分开,接着检查分开的部分长度。如果长度大于2,就可以继续处理。也就是说,先把输入的数字转换一下,看看它是否在指定的范围内。

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

你可能想做的不是改变数值本身。正如Cyber在评论中提到的,即使你把一个浮点数四舍五入,它依然会保持原来的精度。如果你想改变它的显示方式:

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

你为什么不直接用 round 呢?

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

你用的 float 数据类型不太合适,建议用 Decimal

可以查看一下 Python 文档,了解浮点数的问题和限制。这里面有一句话我简单总结了一下:

浮点数在计算机里是用二进制(基数2)的小数来表示的。

不管你愿意用多少个二进制位,有些十进制的值(比如 0.1) 是无法精确表示成二进制的小数的。

如果你只用有限的位数,就只能得到一个近似值。

在普通的运行 Python 的机器上,Python 的浮点数有 53 位的精度,所以当你输入一个十进制数字时,内部存储的其实是一个接近但不完全相等的二进制小数。

内置的 round() 函数的文档说明,它会四舍五入到最近的值,并且在遇到相等的情况时会远离零进行舍入。

最后,文档建议:

如果你在乎你的十进制数在四舍五入时的处理方式,应该考虑使用 decimal 模块。

这对你来说也是适用的,因为你需要小数点后两位的精度,而 float 是无法保证这一点的。


编辑说明:下面的回答是针对原始问题,关于随机浮点数生成的。

既然你需要两位的精确值,我建议你生成范围在 [50, 15000] 的整数随机数,然后再除以 100 来自己转换成浮点数。

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

你在找的就是这个吗?

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模块来实现这个目的。

撰写回答