如何使用Banker在C中的舍入将double转换为int

时间:2012-06-01 06:06:07

标签: c algorithm rounding

我想编写一个函数,使用Banker的Rounding方法将double转换为int(舍入一半到偶数:http://en.wikipedia.org/wiki/Rounding#Round_half_to_even),如:

int RoundToInt(double x);

我该怎么做?

更新

我能得到的最好的是:

int RoundToInt(double x)
{
  int s = (int)x;
  double t = fabs(x - s);

  if ((t < 0.5) || (t == 0.5 && s % 2 == 0))
  {
    return s;
  }
  else
  {
    if (x < 0)
    {
      return s - 1;
    }
    else
    {
      return s + 1;
    }
  }
}

但这很慢,我甚至不确定它是否准确。

是否有一些快速准确的方法来做到这一点。

2 个答案:

答案 0 :(得分:3)

使用标准lrint功能;在默认的舍入模式下,它可以提供您想要的结果。

答案 1 :(得分:1)

double decimal = x % 1;
if(decimal < 0.5) return (int)x;
if(decimal > 0.5) return (int)x + 1;
return (int)x + ((int)x % 2 == 1 ? 1 : 0);