繁体   English   中英

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

[英]C++ Store double in int variable error

这是一个小程序,用于计算“间隔”大小的间隙,这些间距在两个数字之间,从'到'。 然后我计算'大小'(间隙数)并将其存储在一个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在第二种情况下的“存储后的大小”。

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

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

浮点数以有限精度存储,并以二进制形式存储。 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 truncates而不是舍入所以你得到10.在转换为int之前添加一个小值来对抗它。

int size=operation+0.0000000001;

如果要将接近整数的double (由于舍入错误,如其他人所解释的)转换为int ,请始终将值舍入为最接近的整数,例如使用round() ,然后将值转换为int ,因为doubleint转换会截断该值,如果错误为负,则会产生不正确的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM