C++精度计算问题

前言

在一次做(瞎)项(倒)目(腾)的经历中,发现了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次)。

尝试

知道了问题所在,尝试都转flaotdouble、以及向上取整都出错了,最后尝试四舍五入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++的重要性吧,那就重新开始咯!ヾ(◍°∇°◍)ノ゙

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值