当前位置: 首页 > news >正文

iOS NSDecimalNumber 使用

在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

相关文章:

  • linux中断处理原理分析
  • 图论1——基础
  • 移动端 Web 开发前端知识整理
  • Javascript 正则校验身份证
  • 理解原型其实是理解原型链
  • Java 中的 GC -- GC基础常识
  • 五分钟搞定 HTTPS 配置,二哥手把手教
  • 5 Maven生命周期和插件
  • 坦克大战--Java类型 ---- (2)按键设置和用户名的输入
  • Ubuntu SSH root 登录 Permission denied 错误
  • nginx版本升级问题
  • 每天学习2小时,17年前端经验分享,让你前端之路不再迷茫
  • CSS background 属性
  • 节日营销!这样搞-App运营日常
  • CodeForces 709C Letters Cyclic Shift
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2017届校招提前批面试回顾
  • 30天自制操作系统-2
  • DOM的那些事
  • iOS编译提示和导航提示
  • JavaScript 奇技淫巧
  • Javascript设计模式学习之Observer(观察者)模式
  • LeetCode18.四数之和 JavaScript
  • MySQL-事务管理(基础)
  • React Native移动开发实战-3-实现页面间的数据传递
  • webgl (原生)基础入门指南【一】
  • 复杂数据处理
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 数据库巡检项
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #define用法
  • #QT(智能家居界面-界面切换)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (LeetCode C++)盛最多水的容器
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)php投票系统 毕业设计 121500
  • (六)Hibernate的二级缓存
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)编辑寄语:因为爱心,所以美丽
  • ***利用Ms05002溢出找“肉鸡
  • ..回顾17,展望18
  • ./和../以及/和~之间的区别
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net 提取注释生成API文档 帮助文档
  • .NET关于 跳过SSL中遇到的问题
  • ;号自动换行
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • []常用AT命令解释()
  • [14]内置对象
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Android]如何调试Native memory crash issue