/ * 我目前正在学习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。
还有一个疑问,如果我没有像上面那样定义任何变量,那么系统会为结果假设什么数据类型。
答案 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
。
答案 1 :(得分:0)
这几乎肯定是一个舍入错误。自己测试一下 - &gt;
a = 2
b = 1
c = 0.2000000001
res = 4
我建议使用double而不是float,它应该为您提供所需的精度。当然,从双打到整数总是有舍入错误的风险,而不使用某种舍入函数来补偿