前言

在一次做(瞎)项(倒)目(腾)的经历中,发现了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++的重要性吧,那就重新开始咯!ヾ(◍°∇°◍)ノ゙