正如您所指出的,这是浮点数常见的舍入误差问题。如@Howard所述,您应该在显示之前将双精度结果舍入为浮动范围。
我通常也会使用FLT_EPSILON
来帮助处理这些问题。
#define fequal(a,b) (fabs((a) - (b)) < FLT_EPSILON)
#define fequalzero(a) (fabs(a) < FLT_EPSILON)
inline void froundzero(a) { if (fequalzero(a)) a = 0; }
复杂的版本留给读者自己练习,就像他们说的那样 :D