关于OC中浮点型的计算
有时候不得不承认,细心观察生活中的细节,有时候会得到很多。
今天和公司朋友一起订了外卖,因为要分账,就突发奇想用代码来算出每个人花了多少钱。最后发现以前没有注意的细节或者不知道的知识,记录下。
我的代码是这样的:
// 三个人订餐需要的平台费用
CGFloat transMoney = (11.5 + 7 - 28)/3;
// 一个饼的价格
CGFloat singlePingMoney = 21/6;
// 每个人吃饭的费用 总额是61
CGFloat value = (15+singlePingMoney)+transMoney ;
CGFloat value1 = (14+singlePingMoney*2)+transMoney;
CGFloat value2 = (14+singlePingMoney*3+7)+transMoney;
NSLog(@"value = %.2f",value);
NSLog(@"value = %.2f",value1);
NSLog(@"value = %.2f",value2);
NSLog(@"value = %.2f",value2+value1+value);
打印:
问题:代码出来的总额和实际总额不相符,而且相差甚远。
分析:
应该是变量计算中出现了误差,于是打印各个变量值。
// 三个人订餐需要的平台费用
CGFloat transMoney = (11.5 + 7 - 28)/3;
// 一个饼的价格
CGFloat singlePingMoney = 21/6;
NSLog(@"transMoney = %.2f",transMoney);
NSLog(@"singlePingMoney = %.2f",singlePingMoney);
结果:
分析:
结合打印的结果和代码,
transMoney 的值是正确的
singlePingMoney 的值应该有所偏差
改写代码为:
// 一个饼的价格
CGFloat singlePingMoney = 21/6.f;
NSLog(@"singlePingMoney = %.2f",singlePingMoney);
打印:
观点:
在OC除法计算中不能明切除数与被除数为整数时,得到的结果为整数。
论证:
1.当都是没有声明为浮点型时
代码:
CGFloat tempNum = (5 + 5)/3;
NSLog(@"tempNum = %.2f",tempNum);
打印:
2.当都有一个声明为浮点型时
代码:
CGFloat tempNum = (5.f + 5)/3;
NSLog(@"tempNum = %.2f",tempNum);
//或者
CGFloat tempNum = (5.0 + 5)/3;
NSLog(@"tempNum = %.2f",tempNum);
打印:
最后论证了刚才的观点,那么修改初始代码并打印
// 三个人订餐需要的平台费用
CGFloat transMoney = (11.5 + 7 - 28)/3;
// 一个饼的价格
CGFloat singlePingMoney = 21/6.f;
// 每个人吃饭的费用 总额是61
CGFloat value = (15+singlePingMoney)+transMoney ;
CGFloat value1 = (14+singlePingMoney*2)+transMoney;
CGFloat value2 = (14+singlePingMoney*3+7)+transMoney;
NSLog(@"value = %.2f",value);
NSLog(@"value1 = %.2f",value1);
NSLog(@"value2 = %.2f",value2);
NSLog(@"values = %.2f",value2+value1+value);
结果与总金额一致,即计算时,要在不同情境下注意浮点型的计算方法。
友情链接:
技术博客 简书主页