错误的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

输出:

期望输出 :

5

我需要在开始 a 和结束 b 之间找到 res(增量 c 的步骤数)截断到最接近的地板整数值。

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

但只是测试

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

正确给出了 5。

还有一个疑问:如果我不定义任何变量,如上所述,系统将为结果假设什么数据类型?

您有一个古老的四舍五入浮点数问题,它源于浮点数以 2 为底,因此不能完美地表示所有以 10 为底的数字(例如。 0.3)。有关详细信息,请阅读本教程和此 SO 问题。

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

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

你会得到这个打印出来:

4.999999925494195

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

活生生的例子。

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

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

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

最新更新