为何取模运算符对小数无法正常工作?附Python代码问题示例
问题原因
这是浮点数二进制表示的精度误差导致的问题。0.20无法用二进制浮点数精确表示,它在内存中是一个无限循环的近似值。当计算4 % 0.20时,实际得到的是一个非常接近0但不等于0的极小值(比如2.842170943040401e-16),直接和0.0比较就会判定为不相等。
解决方案
可以用以下几种方法修复:
方法1:比较余数与极小阈值
不用严格等于0.0,而是判断余数是否小于一个足够小的数值(比如1e-9),忽略浮点数的精度误差:
while True: num = float(input("Enter a number: ")) remainder = num % 0.20 # 用极小阈值判断是否接近0 if abs(remainder) < 1e-9: print("{} is divisible by 0.20".format(num)) else: print("{} is not divisible by 0.20".format(num))
方法2:转换为整数运算
把所有数乘以100转换成整数,彻底避免浮点数精度问题:
while True: num = float(input("Enter a number: ")) # 转换为整数(乘以100后取整,适配输入的小数) num_int = int(round(num * 100)) # 判断是否能被20整除(0.20*100=20) if num_int % 20 == 0: print("{} is divisible by 0.20".format(num)) else: print("{} is not divisible by 0.20".format(num))
方法3:使用decimal模块处理精确十进制
如果需要更高精度的十进制运算,可使用Python标准库的decimal模块:
from decimal import Decimal, getcontext # 设置足够的运算精度 getcontext().prec = 20 while True: num_str = input("Enter a number: ") num = Decimal(num_str) divisor = Decimal('0.20') remainder = num % divisor if remainder == Decimal('0'): print("{} is divisible by 0.20".format(num)) else: print("{} is not divisible by 0.20".format(num))
内容的提问来源于stack exchange,提问作者James whittaker
相关产品推荐
相关产品推荐

