float比较
2026/8/23大约 1 分钟
C语言浮点数比较:为什么不能直接用 ==
一、为什么不能直接比较?
float a = 0.1f;
float b = 0.2f;
float c = 0.3f;
if (a + b == c)
{
// 不一定成立
}原因:
浮点数采用二进制表示,很多十进制小数无法被精确表示。
计算过程中会产生舍入误差,所以两个理论上相等的浮点数,实际存储值可能略有不同。
二、使用误差范围
最常用的方法是判断两者之差是否足够小:
#include <math.h>
#define EPSILON 1e-6f
int float_equal(float a, float b)
{
return fabsf(a - b) < EPSILON;
}例如:
if (float_equal(a, b))
{
// 认为 a == b
}核心就是:
|a - b| < EPSILON三、相对误差
当数值范围变化很大时,固定误差可能不够合适:
int float_equal(float a, float b)
{
return fabsf(a - b)
<= EPSILON * fmaxf(fabsf(a), fabsf(b));
}它考虑的是:
误差相对于数据本身有多大。
四、嵌入式中的注意事项
某些 MCU 没有 FPU,浮点运算需要软件模拟,计算开销较大。
对实时性要求高、数据范围明确的场景,可以考虑:
定点数代替浮点数。
例如温度保留两位小数:
int temp = 2534; // 表示 25.34℃避免频繁使用浮点运算。
五、最终记忆
float
↓
二进制表示
↓
存在舍入误差
↓
不要简单 == / !=
↓
使用误差范围比较最常用:
fabsf(a - b) < EPSILON浮点数比较的核心不是“是否完全相等”,而是“误差是否足够小”。

