这是一个小程序,用于计算间隔'两个数字之间的大小'来自' '至&#39 ;.然后我计算出'尺寸' (间隙数)并将其存储在int变量中,有时会给我一个较小的值。
以下是代码:
double from=0, to=1, interval=0.1;
cout << "WORKING WITH VARIABLES: " << endl;
double operation = (to-from)/interval +1;
cout << "Size: " << operation << endl;
int size = operation;
cout << "Size after storing: " << size << endl << endl;
cout << "WORKING WITHOUT VARIABLES: " << endl;
cout << "Size: " << (to-from)/interval +1 << endl;
size = (to-from)/interval +1;
cout << "Size after storing: " << size << endl << endl;
问题似乎在于它的存储间隔。如果interval = 1,一切都很好,但是如果是0.1,那么在示例中它给出了10而不是11在&#34;大小后存储&#34;第二个案例。
我发现间隔= 0.25(2 ^ -2)时效果很好。
编辑:我没有发现它在第一种情况下失败,总是在第二种情况下失败。
答案 0 :(得分:5)
浮点数以有限精度存储,并以二进制形式存储。 0.25很容易。那只是1/4,所以0.01二进制。 0.1是1/10,不能用有限二进制串表示。它是1/16 + 1/32 + ...
因此1/10向下舍入,10 * 1/10略小于1.
至于第一种和第二种情况下的不同结果,可能是因为中间值四舍五入到比double
更多的数字。
答案 1 :(得分:4)
您正遭受浮点运算中固有的不准确性。在0.1的情况下你可能得到的是10.999 ....而不是11.将double转换为int truncates而不是舍入所以你得到10.在转换为int之前添加一个小值来对抗它。
int size=operation+0.0000000001;
答案 2 :(得分:0)
如果要将接近整数的double
(由于舍入错误,如其他人所解释的)转换为int
,请始终将值舍入为最接近的整数,例如:使用round()
,在将值转换为int
之前,由于double
到int
转换会截断该值,如果错误为负,则会产生错误的结果。