使用C語言fmod函數計算浮點數餘數時,直接用== 0判斷是否整除往往失效。本文解析浮點數存儲誤差導致的問題,並給出正確的判斷方法。
float x = 1 + (80.1 - 76) / (76 - 75); // x = 5.1
for (y = 380; y <= 450; y++)
if ((n = fmod(y, x)) == 0) // 預期 y=408 時 n=0
{ m = y; break; }
理論上 408 ÷ 5.1 = 80 餘 0,但程序無法檢測到。
fmod(408, 5.1) 計算結果非精確 0,而是極小值如 1.13687e-13== 0 比較失敗#include <math.h> // 需引入 fabs
if (fabs(fmod(y, x)) < 0.0001) // 設定容差閾值
{ m = y; break; }
1e-6、1e-9#define EPS 1e-9fabs(a - b) < EPSfabs(x) < EPS#include <stdio.h>
#include <math.h>
#define EPS 1e-9
int main() {
int a, b, m, y;
float x, n;
x = 1 + (80.1 - 76) / (76 - 75); // 5.1
for (y = 380; y <= 450; y++) {
n = fmod(y, x);
if (fabs(n) < EPS) { // 正確判斷
m = y;
break;
}
}
for (a = 0; a <= m; a++) {
b = m - a;
if (fabs(75*a + 80.1*b - (a+b)*76) < EPS) // 同理修正
printf("男生:%d, 女生:%d\n", a, b);
}
return 0;
}
== 或 != 直接比較浮點數EPS 作為容差常量fabs(a-b)/fmax(fabs(a),fabs(b)) < EPSfmod 本身正確,問題在於浮點數比較方式。牢記「浮點數判等必用容差」原則,可避免 90% 的數值計算 Bug。