C++在int变量错误中存储double

Jum*_*mer 4 c++ floating-point integer

这是一个小程序,用于计算"间隔"大小的间隙,这些间距在两个数字之间,从'到'.然后我计算'大小'(间隙数)并将其存储在一个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;
Run Code Online (Sandbox Code Playgroud)

问题似乎在于它的存储间隔.如果interval = 1,一切都很好,但如果是0.1,那么在例子中它给我10而不是11在第二种情况下的"存储后的大小".

我发现它适用于interval = 0.25(2 ^ -2).

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

小智 5

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

int size=operation+0.0000000001;
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 5

浮点数以有限精度存储,并以二进制形式存储.0.25很容易.那只是1/4,所以0.01二进制.0.1是1/10,不能用有限的二进制串表示.这是1/16 + 1/32 + ......

因此1/10向下舍入,10*1/10略小于1.

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