Дубликат: round () для float в C ++
Я использую VS2008 и включил math.h, но все еще не могу найти круглую функцию. Он существует?
Я вижу кучу добавлений 0.5 и преобразований в решения в Google. Это лучшая практика?
Я использую VS2008 и включил math.h, но все еще не могу найти круглую функцию. Он существует?
Я вижу кучу добавлений 0.5 и преобразований в решения в Google. Это лучшая практика?
Вы можете использовать std::round()
из C ++ 11.
Если вы по-прежнему придерживаетесь старых стандартов, вы можете использовать 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;
}
Используйте второй подход только в том случае, если у вас достаточно ресурсов и / или вам необходимо контролировать точность.
copysignf(floorf(fabs(x) + 0.5f), x)
, поскольку он не имеет веток, а код, имитирующий ветку, буквально является bin-ops (abs
- ›&~0x80000000
, copysign - это битовая передача и т. Д.)
- person LiraNuna; 24.03.2014
trunc
и boost
. Также см. Мою ссылку на статьи Паскаля Куока о том, почему создание собственного может быть очень сложным.
- person Shafik Yaghmour; 27.06.2014
round(-0.0)
этот ответ возвращает 0.0
. -0.0
можно ожидать.
- person chux - Reinstate Monica; 03.08.2015
Использование 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 с полом () кажется правильным решением.