7

嗨,我想在 C++ 中舍入这样的双数(远离零):

  4.2 ---->   5
  5.7 ---->   6
 -7.8 ---->  -8
-34.2 ----> -35

这样做的有效方法是什么?

4

4 回答 4

25
inline double myround(double x)
{
  return x < 0 ? floor(x) : ceil(x);
}

正如Huppie 引用的文章中提到的,这最好表示为适用于所有浮点类型的模板

请参阅http://en.cppreference.com/w/cpp/numeric/math/floorhttp://en.cppreference.com/w/cpp/numeric/math/floor

或者,感谢 Pax,一个非功能版本:

x = (x < 0) ? floor(x) : ceil(x);
于 2009-08-25T07:16:51.207 回答
3

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;
}
于 2009-08-25T07:21:10.510 回答
2

Ruben Bartelinkx < 0 ? floor(x) : ceil(x);方法很好。然而,考虑一下 , 的特殊情况会发生什么。x = -0.0x = NaN

与其myround(-0.0)潜在地返回+0.01myround(NaN)返回带有更改的有效负载NaN,请考虑以下内容。

myround_alt(-0.0)返回-0.0

myround_alt(NaN) 更有可能返回未更改的有效载荷 NaN。非数字的东西很棘手,也没有很好的定义。IAC,就是这个myround_alt(-0.0)-->-0.0我正在求。

inline double myround_alt(double x) {
  if (x > 0) return ceil(x);
  if (x < 0) return floor(x);
  return x;
}

1 IEC 60559 浮点运算指定了ceil(±0)返回±0,因此严格遵循该规范的实现不需要这种方法。然而,许多 C 浮点实现不遵循这一点(C 不需要它)或在这种情况下失败。

于 2020-01-24T18:04:07.950 回答
0

尝试

 double rounded = _copysign(ceil(abs(x)), x);
于 2009-08-25T07:15:26.857 回答