目前正在学习 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 = 2b = 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
我建议使用双精度而不是浮点数,它应该为您提供所需的精度。 当然,从双精度到整数总是有舍入错误的风险,而不使用某种舍入函数来补偿