C++ округление чисел от нуля
Вопрос
Привет, я хочу округлить двойные числа вот так (от нуля) в C++:
4.2 ----> 5
5.7 ----> 6
-7.8 ----> -8
-34.2 ----> -35
Каков эффективный способ сделать это?
Решение
inline double myround(double x)
{
return x < 0 ? floor(x) : ceil(x);
}
Как упоминалось в статья, которую цитирует Хаппи, это лучше всего выражается в виде шаблона, который работает со всеми типами чисел с плавающей запятой.
Видеть http://en.cppreference.com/w/cpp/numeric/math/floor и http://en.cppreference.com/w/cpp/numeric/math/floor
или, благодаря Pax, нефункциональная версия:
x = (x < 0) ? floor(x) : ceil(x);
Другие советы
Есть хорошая статья о похожей проблеме CPlusPlus.com.Простое решение вашей проблемы должно быть примерно таким:
double customRound( double value ) const {
return value < 0 ? floor( value ) : ceil( value );
}
Лучшим решением является упомянутое в статье, в котором используется шаблон:
//--------------------------------------------------------------------------
// symmetric round up
// Bias: away from zero
template <typename FloatType>
FloatType ceil0( const FloatType& value )
{
FloatType result = std::ceil( std::fabs( value ) );
return (value < 0.0) ? -result : result;
}
пытаться
double rounded = _copysign(ceil(abs(x)), x);
Не связан с StackOverflow