繁体   English   中英

错误的 C++ 除法结果

[英]Wrong C++ division result

/*我目前正在学习 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的步数)被截断为最接近的地板整数值。

我尝试将(ab)定义为另一个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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM