这是一个小程序,用于计算两个数字“从”“到”之间的“间隔”大小的差距。然后我计算“大小”(间隙数)并将其存储在一个 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) 时效果很好。
编辑:我没有发现它在第一种情况下失败,在第二种情况下总是失败。
最佳答案
float 以有限精度和二进制形式存储。 0.25 很容易。那只是 1/4,所以 0.01 二进制。 0.1是1/10,不能用有限的二进制串表示。是 1/16+1/32+ ...
所以 1/10 向下舍入,10 * 1/10 略小于 1。
至于第一种和第二种情况的不同结果,这可能是因为中间值四舍五入到比 double
多的位数。
关于C++ 在 int 变量中存储 double 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824113/