如何在c ++中有效地将double转换为int?

时间:2012-12-23 20:01:12

标签: c++

很抱歉没有具体,我只是认为上下文并不重要。

无论如何,如果我把整个代码放在这里或链接是否足够,那么这个问题可以看作Progressbars in win32上我的另一个问题的扩展?

最简单形式的问题可以描述为:

double d1 = x.xxxxxx;
double d2 = x.xxxxxx;
double d3 = x.xxxxxx;
double d4 = x.xxxxxx;
double d5 = x.xxxxxx;
...
...
double dn = x.xxxxxx;


int i1 = (int)d1;
int i2 = (int)d2;
int i3 = (int)d3;
int i4 = (int)d4;
int i5 = (int)d5;
...
...
int in = (int)dn;

int i = i1+i2+i3+i4+i5+...+in;
double d = d1+d2+d3+d4+d5+...+in;

now i needs to be not less then d - 0.5;

怎么做?

编辑:修改了代码。 编辑2:无法预测n的数量,并且d1,d2,...,dn可能小于1,类似于0.345627。

4 个答案:

答案 0 :(得分:4)

我认为您感兴趣的是误差扩散:

double d1 = x.xxxxxx;
double d2 = x.xxxxxx;
double d3 = x.xxxxxx;
double d4 = x.xxxxxx;
double d5 = x.xxxxxx;

double error = 0;
int i1 = (int)floor(d1+error+0.5);
error += d1-i1;
int i2 = (int)floor(d2+error+0.5);
error += d2-i2;
int i3 = (int)floor(d3+error+0.5);
error += d3-i3;
int i4 = (int)floor(d4+error+0.5);
error += d4-i4;
int i5 = (int)floor(d5+error+0.5);

int i = i1+i2+i3+i4+i5;
double d = d1+d2+d3+d4+d5;

每次对值进行舍入时,都会看到引入了多少错误,并将修正传播到下一个计算。这样,您的错误就永远无法建立起来。

答案 1 :(得分:1)

  

现在我需要不低于d - 0.5;

这可以通过向上舍入双打来轻松实现(强制转换为int将它们向0舍入)。

正如Josua Green所说,这可以通过(int)(d + 0.5)(如果d> -0.5)或std::ceil()完成,如果您愿意的话。

答案 2 :(得分:1)

转换为int会截断double:即删除任何分数位。

通过将0.5加到正数而将-0.5加到负数,我们得到了更常规的行为。

int ToInt(double x)
{
   double dx = x < 0.0 ? -0.5 : 0.5;
   return static_cast<int>(x + dx);
}

答案 3 :(得分:0)

总结双打:

double d = d1+d2+d3+d4+d5;

检查双精度总和是否超过整数转换超过0.5

if (d - (int)d > 0.5) { /* Error? */ }