К печать округленное значение, @ Matt J хорошо отвечает на вопрос.
float x = 45.592346543;
printf("%0.1f\n", x); // 45.6
Поскольку большинство значений с плавающей запятой (FP) * двоичное на основе, точное округление до одного десятичное место невозможно, если математически правильный ответ равен x.1, x.2, ...
.
Для преобразования числа FP в ближайший 0.1
это другой вопрос.
Переполнение : Подходы к тому, что первое масштабирование на 10 (или 100, 1000 и т. Д.) Может переполниться при большом x
.
float round_tenth1(float x) {
x = x * 10.0f;
...
}
Двойное округление : Добавление 0,5f и последующее использование floorf(x*10.0f + 0.5f)/10.0
возвращает неверный результат, когда промежуточная сумма x*10.0f + 0.5f
округляется до нового целого числа.
// Fails to round 838860.4375 correctly, comes up with 838860.5
// 0.4499999880790710449 fails as it rounds to 0.5
float round_tenth2(float x) {
if (x < 0.0) {
return ceilf(x*10.0f + 0.5f)/10.0f;
}
return floorf(x*10.0f + 0.5f)/10.0f;
}
Приведение к int
имеет очевидную проблему, когда float x
намного больше, чем INT_MAX
.
Лучше всего использовать roundf()
и семейство, доступное в <math.h>
.
float round_tenthA(float x) {
double x10 = 10.0 * x;
return (float) (round(x10)/10.0);
}
Чтобы не использовать double
, просто проверьте, нужно ли округлить число.
float round_tenthB(float x) {
const float limit = 1.0/FLT_EPSILON;
if (fabsf(x) < limit) {
return roundf(x*10.0f)/10.0f;
}
return x;
}