Дубликат: round() для float в С++
Я использую VS2008, и я включил math.h, но я все еще не могу найти круглую функцию. Он существует?
Я вижу кучу "добавить 0.5 и бросить в int" в google. Это лучшая практика?
Я использую VS2008, и я включил math.h, но я все еще не могу найти круглую функцию. Он существует?
Я вижу кучу "добавить 0.5 и бросить в int" в google. Это лучшая практика?
Вы можете использовать С++ 11 std::round()
.
Если вы все еще придерживаетесь более старых стандартов, вы можете использовать std::floor()
, который всегда округляется до более низкого значения, а std::ceil()
, который всегда округляется до большего числа.
Чтобы получить нормальное поведение округления, вы действительно используете floor(i + 0.5)
.
Этот способ даст вам проблемы с отрицательными числами, обходным путем для этой проблемы является использование ceil() для отрицательных чисел:
double round(double number)
{
return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}
Другим, более чистым, но ресурсоемким способом является использование строкового потока и манипуляторов ввода/вывода:
#include <iostream>
#include <sstream>
double round(double val, int precision)
{
std::stringstream s;
s << std::setprecision(precision) << std::setiosflags(std::ios_base::fixed) << val;
s >> val;
return val;
}
Используйте только второй подход, если у вас мало ресурсов и/или необходимо контролировать точность.
Использование floor(num + 0.5)
не будет работать для отрицательных чисел. В этом случае вам нужно использовать ceil(num - 0.5)
.
double roundToNearest(double num) {
return (num > 0.0) ? floor(num + 0.5) : ceil(num - 0.5);
}
На самом деле в Microsoft math.h отсутствует круговая функция.
Однако вместо этого вы можете использовать статический метод Math:: Round().
(В зависимости от типа вашего проекта.)
Я не знаю, подходит ли это практике или нет, но с использованием метода 0,5 с полом() кажется, что это путь.