C ++(int)静态转换奇怪的错误

时间:2011-06-23 02:31:07

标签: c++

我对c ++有一个非常奇怪的错误。 我有两个值,max和singleStep。步骤数是stepsInt和/或stepsDbl:

max = 100;
singleStep = 0.1;
// This means that I have 100/0.1 = 1000 numbers betwwen 0 and 100
double stepsDbl = max/singleStep;
int stepsInt = (int)(stepsDbl);
cout << stepsDbl << stepsInt;

你可以期待这样的输出:

1000 1000

但是我得到了这个输出:

1000 999

更重要的是,如果我为singleStep尝试不同的值,例如0.2,我会再次得到错误的值

500 499

我不知道发生了什么,但很奇怪......如果有人有这个问题的解决方案,我会很感激这个解决方案。

由于

3 个答案:

答案 0 :(得分:1)

(int)向左转,(double)算术本身就不可靠(查找浮点数学)。 operator<<(double)向最近的方向舍入,因此累积的FP不准确所导致的999.999999999999值将直接打印为1000,而999则会在天真地投放到(int)

答案 1 :(得分:0)

平台上的浮点数不能准确表示没有有限二进制扩展的数字,因此使用这些数字时自然会有不确定性。使用有理数,并尽可能将“0.1”保持为“1/10”。

(“有限二进制展开”是指“2的幂的有限和”.1 / 5不是2的幂的有限和,也不是1/3和1/10。)

答案 2 :(得分:0)

请改为尝试:

int stepsInt = (int)floor(stepsDbl+.5);

您看到的“问题”是因为浮点数在内部存储的方式。