关于OC中浮点型的计算
有时候不得不承认,细心观察生活中的细节,有时候会得到很多。
今天和公司朋友一起订了外卖,因为要分账,就突发奇想用代码来算出每个人花了多少钱。最后发现以前没有注意的细节或者不知道的知识,记录下。
我的代码是这样的:
// 三个人订餐需要的平台费用
CGFloat transMoney = (11.5 + 7 - 28)/3;
// 一个饼的价格
CGFloat singlePingMoney = 21/6;
// 每个人吃饭的费用 总额是61.5
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);

结果与总金额一致,即计算时,要在不同情境下注意浮点型的计算方法。
友情链接:
技术博客 简书主页
关于OC中浮点型的计算的更多相关文章
- Java中浮点型数据Float和Double进行精确计算的问题
Java中浮点型数据Float和Double进行精确计算的问题 来源 https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失 ...
- OC中控制台日志打印
OC中Debug版本常用的打印格式化操作 %@ 对象 %d,%i 整型 (%i的老写法) %hd 短整型 %ld , %lld 长整型 %u 无符整型 %f 浮点型和doubl ...
- OC中面向对象2
一. 定义OC的类和创建OC的对象 接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现 ...
- OC基础--OC中的类方法和对象方法
PS:个人感觉跟C#的静态方法和非静态方法有点类似,仅仅是有点类似.明杰老师说过不要总跟之前学过的语言做比较,但是个人觉得,比较一下可以加深印象吧.重点是自己真的能够区分开! 一.OC中的对象方法 1 ...
- 编译时和运行时、OC中对象的动态编译机制
编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...
- objective-c中字符串长度计算
我们知道,在c语言中,使用sizeof ()计算在内存中占用的字节数, 引用string.h后,使用strlen()计算字符串的长度(不包含\0). 而在object-c中, "length ...
- OC中的枚举类型
背景 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错. 什么是位移操作枚举呢? typedef NS_OPTIONS(NSUInteger, UIViewAutores ...
- OC中NSLog函数输出格式详解
OC中NSLog函数输出格式详解 %@ 对象 • %d, %i 整数 • %u 无符整形 • %f 浮点/双字 • %x, %X 二进制整数 • %o 八进制整数 • %zu size_t • %p ...
- OC中的结构体
一.结构体 结构体只能在定义的时候进行初始化 给结构体属性赋值 + 强制转换: 系统并不清楚是数组还是结构体,需要在值前面加上(结构体名称) +定义一个新的结构体,进行直接赋值 + ...
随机推荐
- 7、创建ROS msg和srv
一.msg和srv介绍 msg: msg文件使用简单的文本格式声明一个ROS message的各个域. 仅须要创建一个msg文件,就能够使用它来生成不同语言的message定义代码. srv:srv文 ...
- 一段文字中的几个keyword显示高亮
将一段文字中的几个keyword显示高亮 演示样例:将"我的愿望是当个绿巨人,所以我想让我的皮(derma)肤是绿色"中的"皮肤"显示绿色. <span ...
- NBUT 1217 Dinner
[1217] Dinner 时间限制: 1000 ms 内存限制: 32768 K 问题描写叙述 Little A is one member of ACM team. He had just won ...
- 深入理解JSP
JSP(Java server page)是Java EE规范最基本成员,他是Java Web开发的重点知识,尽管我们一直在用.但其原理知之甚少.今天重点研究一些JSP核心内容以及其工作原理. JSP ...
- immutable.js 更新数组(mergeDeepWith)
使用情境: 技术栈为:react + redux + antd (reducer中处理数据使用了immutable.js). 问题:如下图,做一个搜索功能,form表单每改变一次,都会调用一个upda ...
- Unix权限这点事
Unix/Linux的权限管理还是比较复杂的,别人说看高级环境编程得看2,3遍.我想这应该是在Linux有了一定基础.但是我看的过程中确需要反复推敲,有些地方得翻来覆去看上5,6遍甚至更多,下面是自己 ...
- .NET 对 XML 进行创建,增加,删除,修改操作整理
前言: 最近做了一个项目,程序A在一个服务器程序B在另一台服务器,然而主程序A需要访问程序B的图片集文件夹下载到本服务器上,为了防止多次对Web Services进行调用,在主程序A中创建一个XML文 ...
- 【ANT】taskdef class org.programmerplanet.ant.taskdefs.jmeter.JMeterTask cannot be found using the classloader AntClassLoader[]解决办法
把文件apache-jmeter-3.1\extras\ant-jmeter-1.1.1.jar复制到apache-ant-1.10.1\lib目录下即可.
- 【java API基本实现】ArrayList
ArrayList: package com.tn.arraylist; public class ArrayList { Object[] objects=new Object[10]; int i ...
- sqlserver 存储过程 修改
CREATE PROCEDURE [dbo].[UpdateMessage] @strTable varchar(), --要修改的表 @strColumn varchar(),--要修改的列名(如果 ...