float.is_integer() 不做精度控制,仅当浮点数二进制表示恰好为整数时返回True;对0.1+0.2等浮点误差完全不敏感,判断“近似整数”需自行添加容差逻辑。

直接说结论: float.is_integer() 不做任何精度控制,它只看浮点数的二进制表示是否恰好等于某个整数——也就是说,它不处理“近似整数”问题。你不能靠它来判断 2.9999999999999996 是否“应该算作 3”,它只会坚定返回 False。
为什么 is_integer() 对浮点误差完全不敏感
这个方法底层检查的是 IEEE 754 浮点数的尾数(mantissa)是否为 0,即该值能否被精确表示为整数。它不进行四舍五入、不调用 round()、也不容忍任何小数位偏差。
- 常见错误现象:
0.1 + 0.2 == 0.3是False,所以(0.1 + 0.2).is_integer()也一定是False,哪怕你心里知道它“本该是整数” - 使用场景:适合已知计算路径干净(比如来自
int()转换、整除结果、或明确赋值如5.0)时的快速校验 - 性能影响:极快,纯 C 实现,无函数调用开销
想判断“近似整数”?得自己加容差逻辑
如果你的浮点数来自计算(尤其是除法、开方、三角函数等),is_integer() 基本不可用。必须引入数值容差(tolerance)。
- 推荐做法:用
abs(x - round(x)) 替代 <code>x.is_integer() - 注意不要用
math.isclose(x, round(x))—— 它默认用相对误差,对接近 0 的数可能误判 - 避免
x % 1 == 0:同样受浮点误差影响,2.0000000000000004 % 1结果不是0.0,而是极小正数 - 如果输入可能为负数,
round(x)比int(x)更安全(后者向零截断)
混合类型输入时,is_integer() 会直接报错
它只属于 float 实例,对 int、str、None 等调用会抛出 AttributeError。
立即学习“Python免费学习笔记(深入)”;
- 典型错误:
5.is_integer()→SyntaxError(数字字面量不能直接点方法,得写成(5).is_integer()) - 更常见错误:
"5.0".is_integer()→AttributeError: 'str' object has no attribute 'is_integer' - 安全写法:先用
isinstance(x, float)判断,再调用;或统一转float(x)(但要注意字符串转换可能引发ValueError) - 别依赖
type(x) is float:它不认子类,而isinstance更健壮
真正容易被忽略的一点:很多人以为 is_integer() 是“语义上是否为整数”的权威判断,其实它只是“机器表示上是否为精确整数”。一旦涉及计算链路,你就得主动接管精度责任——库不会替你决定“多近才算整”。


















