我对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
我不知道发生了什么,但很奇怪......如果有人有这个问题的解决方案,我会很感激这个解决方案。
由于
答案 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);
您看到的“问题”是因为浮点数在内部存储的方式。