评论

收藏

[C++] C++精度计算问题

编程语言 编程语言 发布于:2021-12-28 17:15 | 阅读数:321 | 评论:0

前言
在一次做(瞎)项(倒)目(腾)的经历中,发现了C++精度计算问题很复杂,害得我找了半天都没有找到这个错误,在学哥的帮助下最终找到了问题所在,特此记之。

代码
这是抽离出来的主要代码。
#include<iostream>
using namespace std;
void genAgent(int islandnum, int agentnum, float addagent)
{
  int i=0;
  for (int k = 0; k < islandnum; k++)//遍历每个island
  { 
  cout << agentnum * (islandnum + k * addagent) << "___" << agentnum * (islandnum + (k + 1) * addagent) << endl;
  for (i = agentnum * (islandnum + k * addagent); i < agentnum * (islandnum + (k + 1) * addagent); i++)//新增信息
  {
    cout << "我是i:" << i << endl;
  }
  }
}
int main()
{
  genAgent(4, 50, 0.2);
  system("pause");
  return 0;
}
结果
200___210
我是i:200
我是i:201
我是i:202
我是i:203
我是i:204
我是i:205
我是i:206
我是i:207
我是i:208
我是i:209
210___220
我是i:209
我是i:210
我是i:211
我是i:212
我是i:213
我是i:214
我是i:215
我是i:216
我是i:217
我是i:218
我是i:219
220___230
我是i:220
我是i:221
我是i:222
我是i:223
我是i:224
我是i:225
我是i:226
我是i:227
我是i:228
我是i:229
230___240
我是i:230
我是i:231
我是i:232
我是i:233
我是i:234
我是i:235
我是i:236
我是i:237
我是i:238
我是i:239
我是i:240   (问题所在)
请按任意键继续. . .
问题
我们可以轻易地看见"问题所在"的栏目是不应该存在的,也就是在最后一次循环中输出了11次(实际应该是10次)。

尝试
知道了问题所在,尝试都转​​flaot​​​、​​double​​​、以及​​向上取整​​​都出错了,最后尝试四舍五入​​round()​​函数解决问题,虽然这个解决办法有些简单,但是对于C++精度问题注定是一个陷阱!

改进
#include<iostream>
#include<math.h>
using namespace std;
void genAgent(int islandnum, int agentnum, float addagent)
{
  int i=0;
  for (int k = 0; k < islandnum; k++)//遍历每个island
  { 
  cout << agentnum * (islandnum + k * addagent) << "___" << agentnum * (islandnum + (k + 1) * addagent) << endl;
  for (i = round(agentnum * (islandnum + k * addagent)); i < round(agentnum * (islandnum + (k + 1) * addagent)); i++)//新增信息
  {
    cout << "我是i:" << i << endl;
  }
  }
}
int main()
{
  genAgent(4, 50, 0.2);
  system("pause");
  return 0;
}
结果
200___210
我是i:200
我是i:201
我是i:202
我是i:203
我是i:204
我是i:205
我是i:206
我是i:207
我是i:208
我是i:209
210___220
我是i:210
我是i:211
我是i:212
我是i:213
我是i:214
我是i:215
我是i:216
我是i:217
我是i:218
我是i:219
220___230
我是i:220
我是i:221
我是i:222
我是i:223
我是i:224
我是i:225
我是i:226
我是i:227
我是i:228
我是i:229
230___240
我是i:230
我是i:231
我是i:232
我是i:233
我是i:234
我是i:235
我是i:236
我是i:237
我是i:238
我是i:239
请按任意键继续. . .

总结
渐渐地应该明白C++的重要性吧,那就重新开始咯!ヾ(◍°∇°◍)ノ゙






关注下面的标签,发现更多相似文章