博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS NSDecimalNumber 使用
阅读量:7068 次
发布时间:2019-06-28

本文共 4569 字,大约阅读时间需要 15 分钟。

在iOS开发中,经常遇到和货币价格计算相关的,这时就需要注意计算精度的问题。使用float类型运算,经常出现误差。为了解决这种问题我们使用NSDecimalNumber,下面将通过例子的形式给大家展示一下。

1.加法的运算

//方式1:不进行四舍五入self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",3.155]]; self.number2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",6.1]]; NSDecimalNumber *num = [self.number2 decimalNumberByAdding:self.number1]; NSLog(@"num===%@",num); //方式2:进行四舍五入 NSRoundUp属性使所有的操作算到最近的位置,其他的进位选项是NSRoundPlain, NSRoundDown, 和 NSRoundBankers,它们都被定义在NSRoundingMode,scale参数定义了结果值保留的小数位的数量,其余的参数给所有的操作定义了异常处理行为. //scale四舍五入,舍入位数 NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; NSDecimalNumber *num = [self.number2 decimalNumberByAdding:self.number1 withBehavior:roundUp]; NSLog(@"num===%@",num);

2.减法运算

//方式1:不进行四舍五入self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",10.1543]]; self.number2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",2.3]]; NSDecimalNumber *num = [self.number1 decimalNumberBySubtracting:self.number2]; NSLog(@"num===%@",num); //方式2:进行四舍五入 NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; NSDecimalNumber *num = [self.number1 decimalNumberBySubtracting:self.number2 withBehavior:handler]; NSLog(@"num===%@",num);

3.乘法的运算

//方式1:不进行四舍五入self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",10.001]]; self.number2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",2]]; NSDecimalNumber *num = [self.number1 decimalNumberByMultiplyingBy:self.number2]; NSLog(@"num===%@",num); //方式2:进行四舍五入 NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; NSDecimalNumber *num = [self.number1 decimalNumberByMultiplyingBy:self.number2 withBehavior:handler]; NSLog(@"num===%@",num);

4.除法的运算

//方式1:不进行四舍五入self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%f",10.14]]; self.number2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",2]]; NSDecimalNumber *num = [self.number1 decimalNumberByDividingBy:self.number2]; NSLog(@"num===%@",num); //方式2:进行四舍五入 NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:1 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; NSDecimalNumber *num = [self.number1 decimalNumberByDividingBy:self.number2 withBehavior:handler]; NSLog(@"num===%@",num);

5.比较

self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",2]]; self.number2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",2]]; //self.number1 < self.number2 if ([self.number1 compare:self.number2] == NSOrderedAscending) { NSLog(@"self.number1 < self.number2"); }else if([self.number1 compare:self.number2] ==NSOrderedDescending){ //self.number1 > self.number2 NSLog(@"self.number1 > self.number2"); }else if ([self.number1 compare:self.number2] == NSOrderedSame){ //self.number1 = self.number2 NSLog(@"self.number1 = self.number2"); }

6.指数运算

//方式1:不进行四舍五入self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",2]]; NSDecimalNumber *num = [self.number1 decimalNumberByMultiplyingByPowerOf10:2]; //方式2:进行四舍五入 NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; NSDecimalNumber *num = [self.number1 decimalNumberByMultiplyingByPowerOf10:2 withBehavior:handler]; NSLog(@"~~~%@",num);

7.次方运算

//方式1:进行四舍五入self.number1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%d",2]]; NSDecimalNumber *num = [self.number1 decimalNumberByRaisingToPower:2]; //方式2:进行四舍五入 NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; NSDecimalNumber *num = [self.number1 decimalNumberByRaisingToPower:4 withBehavior:handler]; NSLog(@"~~~%@",num);

转载于:https://www.cnblogs.com/soulDn/p/10827053.html

你可能感兴趣的文章
Hibernate5-进阶添加工具类,对获取Session的方法封装
查看>>
通过内存映射文件来颠倒文本内容(暂没有处理Unicode和换行符)
查看>>
Debian软件包信息查询
查看>>
天猫物流提速背后:大数据加速颠覆传统零售业
查看>>
网页优化十大策略
查看>>
为每一个table单元格设置不同的背景颜色
查看>>
盘点智能硬件中那些脑洞大开的黑科技
查看>>
[HDFS Manual] CH4 HDFS High Availability Using the Quorum Journal Manager
查看>>
maven pom.xml详解
查看>>
活动目录数据库文件介绍
查看>>
Linux下配置tomcat+apr+native应对高并发
查看>>
html5播放mp4视频代码
查看>>
孟子>正文 活动目录(Active Directory)域故障解决实例(转载)
查看>>
NoSuchMethodError: org.hibernate.SessionFactory.openSession
查看>>
textarea自动调整高宽
查看>>
python基础---面向对象高级
查看>>
vim的分屏
查看>>
windows客户端安装
查看>>
关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)
查看>>
Centos7怎么安装gnome桌面及远程桌面VNC
查看>>