Как вы заметили, это стандартная ошибка ошибки округления с плавающей запятой. А @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