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

标签 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;

问题似乎在于它的存储间隔。如果 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/

相关文章:

c++ - 将 uint64_t 转换为 double 后出现意外结果

Python 为什么是 10e26 != 10**26 ? ( float 不准确?)

javascript - JS用什么技巧显示/计算 float

c++ - sstream 无法正常工作?

用于定义公共(public)变量 static const integer 的 C++ 标准

c++ - 在 main 中包含基类和继承类的 header

c++ - 如何将 C++ 概念与 type_traits 结合使用?

c++ - 在每分钟开始时运行一个函数?

swift - 如何在 Swift 中生成大范围的随机数?

arrays - 在 swift 中使用数组的数组