Вы должны делать это только при форматировании числа для отображения конечному пользователю, потому что нет гарантии, что
float rounded = roundf(orig * 100) / 100.0;
или аналогичный вернет точный ответ.
Действительно, в общем, не будет. Например, рассмотрим
float f = 123456.3;
float r = roundf(f * 100) / 100.0;
printf("%.2f, %.10f\n", r, r);
который выводит
123456.30, 123456.2968750000
Oops!
Использование double
вместо float
помогает, но даже в этом случае, если мы немного изменим код, вы увидите, что это на самом деле не решает проблему:
double f = 123456.3;
double r = round(f * 100) / 100.0;
printf("%.2f, %.20f\n", r, r);
Опять получаем
123456.30, 123456.30000000000291038305
, что довольно ясно показывает, что оно не совсем округлено.
В любом случае, мораль этой истории заключается в том, что такие вещи, как round(f * 100) / 100.0
только раунды приблизительно . В некоторых случаях это может быть достаточно хорошо, но вы должны помнить, что результат не является действительно округленным.
Если вы хотите что-то лучше, вам нужно вместо этого использовать десятичную арифметику. Вы можете сделать это, сохраняя свои значения в виде целых чисел (например, для валютных значений, храните их в пенсах или центах вместо фунтов или долларов), или используя один из различных десятичных пакетов с плавающей запятой, которые вы можете найти в десятичной системе Википедии Страница с плавающей точкой .