错误的C ++分区结果

时间:2016-03-11 22:11:36

标签: c++

/ * 我目前正在学习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。

还有一个疑问,如果我没有像上面那样定义任何变量,那么系统会为结果假设什么数据类型。

2 个答案:

答案 0 :(得分:9)

你有一个古老的圆形浮点问题,这个问题源于浮点数是2的基数,因此不能完美地代表所有基数10(例如0.3)。 Read this tutorial以及此SO question了解详情。

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

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

你会得到这个打印出来的:

4.999999925494195

什么是(int)4.9999...?它是4

Live example.

答案 1 :(得分:0)

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

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

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

相关问题