
0 前言C编程用到浮点数时一些细节不注意可能会引入莫名的边界BUG本文记录项目过程遇到需注意的地方并总结取整、比较方法/技巧。1 取整函数说明备注floor()地板往下走只会变小或不变注正数和C默认转换int一样负数则不同-1.5 → -2ceil()天花板往上走只会变大或不变round()四舍五入就近走看小数部分≥0.5 进位2 比较不同于整数浮点数的比较需要考虑精度尤其是“相等”判断。1方法1#include math.h double val 0.0; if (fpclassify(val) FP_ZERO) { // val 是零包括正零和负零 }2方法2#include glib.h double x 0.1 0.2 - 0.3; if (G_APPROX_VALUE(x, 0.0, 1e-9)) { // 当 x 和 0.0 的差值小于 1e-9 时这里的代码会被执行 g_print(x is approximately zero.\n); }3方法3#include math.h #include float.h double x 0.1 0.2 - 0.3; if (fabs(x) DBL_EPSILON) { // 这里的判断非常严格等同于检查 x 是否为一个“不可见的”极小误差 }4方法4下面是vte项目封装来判断两个浮点数是否相等的函数static inline bool _vte_double_equal(double a, double b) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored -Wfloat-equal return a b; #pragma GCC diagnostic pop } // file: vte2/src/fonts-pangocairo.cc参考资料[1]C语言怎么去浮点数