很抱歉没有具体,我只是认为上下文并不重要。
无论如何,如果我把整个代码放在这里或链接是否足够,那么这个问题可以看作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。
答案 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? */ }