在int变量error中存储double



这是一个小程序,用于计算'interval'大小的差距,即两个数字'from' 'to'之间的差距。然后我计算"大小"(间隙数)并将其存储在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在"Size after storage"的第二种情况。

我发现interval=0.25(2^-2)时效果很好。

EDIT:我没有发现它在第一种情况下失败,在第二种情况下总是失败。

浮点数以有限精度存储,并且以二进制形式存储。0.25很简单。就是1/4,所以二进制是0.01。0.1是1/10,不能用有限的二进制字符串表示。等于1/16+1/32+…

所以1/10是四舍五入的,10 * 1/10略小于1。

对于第一种和第二种情况的不同结果,这可能是因为中间值被四舍五入到比double更多的数字。

您正在遭受浮点算术固有的不准确性。0.1的情况下你可能得到的是10.999....而不是11。将double转换为int会截断而不是四舍五入,因此得到10。在转换为int之前添加一个小值来解决这个问题。

int size=operation+0.0000000001;

如果要将接近整数的double(由于舍入错误,如其他人所解释的)转换为int,在将值转换为int之前,始终将值四舍五入到最接近的整数,例如round(),因为doubleint的转换将截断值,并且如果错误为负,将产生不正确的结果

最新更新