You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何取模运算符对小数无法正常工作?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:55:32