前言
在一次做(瞎)項(倒)目(騰)的經歷中,發現了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++的重要性吧,那就重新開始咯!ヾ(◍°∇°◍)ノ゙