Python中浮点数逻辑整除但取模判断返回False的问题求解
浮点数整除判断的精度问题解决方法
这是因为浮点数在计算机中以二进制形式存储,像11.20这类十进制小数无法被精确表示为二进制浮点数,导致取模运算后得到的是一个极小的非零值(比如56.0 % 11.2实际结果是1.7763568394002505e-15),所以直接用== 0判断会返回False。
这里有几种解决办法:
使用decimal模块精确处理十进制小数
这个模块可以精准控制小数精度,避免二进制浮点数的精度损失:from decimal import Decimal, getcontext # 设置精度为两位小数,匹配你的数值小数位数 getcontext().prec = 2 num = Decimal('56.00') divisor = Decimal('11.20') print(num % divisor == Decimal('0')) # 输出True转换为整数进行运算
把两个浮点数都乘以10的n次方(n是小数的位数,这里是2),转成整数后再做取模判断:num = 56.00 divisor = 11.20 # 转换为整数,消除小数部分的精度问题 num_int = int(num * 100) divisor_int = int(divisor * 100) print(num_int % divisor_int == 0) # 输出True如果不确定小数位数,可以先把数值转成字符串,统计小数点后的位数来确定乘数。
判断结果是否在极小误差范围内
利用浮点数误差极小的特点,设置一个阈值(比如1e-9),只要取模结果的绝对值小于这个阈值,就认为是整除:num = 56.00 divisor = 11.20 epsilon = 1e-9 print(abs(num % divisor) < epsilon) # 输出True
内容的提问来源于stack exchange,提问作者Redouane TEBBOUNE
相关产品推荐
相关产品推荐

