1 / 0.2 应该是5,那为什么结果是4呢? [重复]

问题描述 投票:0回答:2

/* 我目前正在学习 C++ 作为我的核心科目的一部分 */

奇怪的是,在编写另一个长程序时我遇到了这个实例

#include <iostream>
#include <cmath>
using namespace std;  
int main()
  {
    int a,b,res; float c;
    cin>>a;
    cin>>b;
    cin>>c;
    res=(a-b)/c;
    cout<<res;
  }

输入:

a = 2 b = 1 c = 0.2

输出:

4

所需输出:

5

我需要在起始 a 和结束 b 之间找到 res(增量 c 的步数),并截断为最接近的下限整数值。

我尝试将 (a-b) 定义为另一个 int,结果仍然是 4 而不是 5。

但只是测试

int main()
{
    cout<<(2-1)/0.2;
}

正确给出了5。

还有一个疑问:如果我没有像上面那样定义任何变量,系统将采用什么数据类型来表示结果?

c++ floating-point
2个回答
9
投票

您遇到了舍入浮点数的老问题,这是由于浮点数以 2 为基数,因此不能完美地表示所有以 10 为基数的数字(例如

0.3
)。 阅读本教程和这个SO问题以获取更多信息。

对于您的示例,请尝试将其添加到您的程序中:

cout << std::setprecision(16) << (float)(a-b)/c << endl;

您将得到此打印结果:

4.999999925494195

什么是

(int)4.9999...
?是
4

实例。


-1
投票

这几乎肯定是一个舍入错误。自己测试一下 ->

a = 2
b = 1
c = 0.2000000001
res = 4

我建议使用双精度而不是浮点数,它应该为您提供所需的精度。当然,从双精度数到整数总是存在舍入错误的风险,而不使用某种舍入函数来补偿

© www.soinside.com 2019 - 2024. All rights reserved.