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);
iOS NSDecimalNumber 使用的更多相关文章
- iOS NSDecimalNumber 货币计算 四舍五入
今天遇到一个问题 服务器返回货币数据 妈的 用string > floatvalue 不准确 去百度查查 妈的国人分享精神真差 真他妈的自私 一个破壁文章没几个字 还是从国外翻译过来的 全 ...
- 【转】iOS开发 -- Apple Pay
技术博客原地址:http://www.cnblogs.com/dashunzi/p/ApplePay.html#top 原技术博客中有源码和视频,有感兴趣的朋友可以研究一下! 一.什么是Apple P ...
- 关于OC中的小数精确计算---NSDecimalNumber
NSDecimalNumber 翻译补充自:http://rypress.com/tutorials/objective-c/data-types/nsdecimalnumber 感谢乐于分享的大神 ...
- iOS的后台任务
翻译自:http://www.raywenderlich.com/29948/backgrounding-for-ios (代码部分若乱码,请移步原链接拷贝) 自ios4开始,用户点击home按钮时, ...
- iOS Apple Pay
iOS 苹果支付 需要证书支持支付功能 targets 打开支付功能按钮 //ApplePay#import <PassKit/PassKit.h> ...
- iOS开发 Apple Pay
一.什么是Apple Pay? 1. 概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借 ...
- ios开发理解nil,Nil, NULL
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空.这些可以理解为nil,Nil, NULL的区别吧. iOS剪切板 UIPasteboard *pasteboard = [ ...
- iOS 开发中遇到的问题
1. 关于纠结很久的KVO崩溃问题,其真正原因是,在删除roomItem的KVO之前,将这个对象已经赋值为nil,所以实际上并没有删除他的observer,因此而崩溃:长时间纠结的原因是受.cxx_d ...
- iOS Foundation 框架概述文档:常量、数据类型、框架、函数、公布声明
iOS Foundation 框架概述文档:常量.数据类型.框架.函数.公布声明 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业 ...
随机推荐
- Hadoop安装全教程 Ubuntu14.04+Java1.8.0+Hadoop2.7.6
最近听了一个关于大数据的大牛的经验分享,在分享的最后大牛给我们一个他之前写好的关于大数据和地理应用demo.这个demo需要在Linux环境上搭建Hadoop平台.这次就简单的分享一下我关于在 Lin ...
- eos管理页面
调用此方法删除需要在po_module_processdef添加数据如下 默认情况下申请页面是有权限的 但是在此表加过之后 管理页面要打开拟稿页面还必须在 系统管理页面(xtgl.jsp ) 分 ...
- junit 直接执行测试方法报错
在eclipse中,直接右击test1->Run As->Junit Test,报下面的错: java.lang.NoSuchMethodError: org.junit.runner.R ...
- Git 分支管理 不使用Fast forward模式进行合并 分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...
- SpringMVC中的常用注解
RequestParam 作用: 用于 将请求参数区数据 映射到 功能处理方法的参数上. 属性: value 请求参数中的名称 required 请求参数中是否必须提供此参数. 默认值: ...
- pandas基础(1)_Series和DataFrame
1:pandas简介 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标 ...
- [51nod] 1091 线段的重叠 贪心
X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...
- How to use unity CreateExternalTexture on Android?
http://stackoverflow.com/questions/33324753/how-to-use-unity-createexternaltexture-on-android Can so ...
- poj3225(线段树区间更新&hash)
题目链接: http://poj.org/problem?id=3225 题意: 初始给一个全局为 0~65536 的区间 s, 然后不断地对区间 s 进行 并, 交, 差, 相对差等运算, 输出最 ...
- 4.Python的不堪一击到初学乍练(列表,元组)
Python(列表,元组) 一.列表 列表初识 列表是python的基础数据类型之一,其他编程语言也有类似的数据类型. 比如JS中的数组, java中的数组等等,它是以[ ]括起来, 每个元素用&qu ...