NSDecimalNumber 金额数据的精确计算
2016-02-16 10:17
399 查看
在IOS数据开发中 我们常使用基础数据类型来进行计算,但是float、double等格式下 整数据多位数时常出现系统自动修改值的情况(例如18--》18.000000001和17.99999999),对于一些需要精确计算的数据(例如金额),就需要使用NSDecimalNumber来计算。可以解决这个问题。
下面只是简要说明一下一些基本运算方式,苹果已经封装的很好了。NSDecimalNumber还可以用于科学技术法计算大数据,但是我还没使用过。。。这里就不介绍了。。
直接贴代码:
/**
* 枚举
* NSRoundPlain // Round up on a tie //貌似取整(个人自测也符合四舍五入)
* NSRoundDown // Always down //只舍不入(舍去)
* NSRoundUp // Always up //只入不舍(进1法)
* NSRoundBankers // on a tie round so last digit is even
这个 好像也是四舍五入(银行的算法?)
*scale 需要保留的小数位数
元数据未达到该位数时,显示元数据
*raiseOnExactness 提高精确度
*raiseOnOverflow 提高上溢?
*raiseOnUnderflow 提高下溢?
*raiseOnDivideByZero 是否允许被0整除
允许下输入0 崩溃
不允许下输入0 输出NaN
所有NSDecimalNumber对象是不可变的,这意味着已经被创建后不能改变它们的值。
对于NSDecimalNumber 还不是很了解 ,希望有更了解的朋友讨论分享。对于上面有错误的地方,还望不吝赐教!多多交流。
下面只是简要说明一下一些基本运算方式,苹果已经封装的很好了。NSDecimalNumber还可以用于科学技术法计算大数据,但是我还没使用过。。。这里就不介绍了。。
直接贴代码:
NSString *aStr=@"0.5"; NSString *bStr=@"0.25"; NSDecimalNumber *numberA=[NSDecimalNumber decimalNumberWithString:aStr]; NSDecimalNumber *numberB=[NSDecimalNumber decimalNumberWithString:bStr]; //A+B NSDecimalNumber *resultANumber=[numberA decimalNumberByAdding:numberB]; //A/B NSDecimalNumber *resultBNumber=[numberA decimalNumberByDividingBy:numberB]; //(B不能为0) //A*B NSDecimalNumber *resultCNumber=[numberA decimalNumberByMultiplyingBy:numberB]; //A*10的阶乘(传入参数为乘数10的指数 eg 10(1)为10 10(2)为100 ) NSDecimalNumber *resultDNumber=[numberA decimalNumberByMultiplyingByPowerOf10:10]; //A的阶乘 NSDecimalNumber *resulteENumber=[numberA decimalNumberByRaisingToPower:3]; //A-B NSDecimalNumber *resulteFNumber=[numberA decimalNumberBySubtracting:numberB];NSDecimalNumber还提供了一个behavior事件 可以对输出结果进行修改:
//创建一个事件Behavior 用于自定义输出结果的数据格式 NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:YES raiseOnOverflow:YES raiseOnUnderflow:YES raiseOnDivideByZero:YES]; //调用该事件影响计算结果 NSDecimalNumber *resultHNumber=[numberA decimalNumberByMultiplyingBy:numberB withBehavior:roundUp];关于behavior事件中的各参数网络上都是类似的答案 但是我自己测试了几次数据 发现是有出入的:
/**
* 枚举
* NSRoundPlain // Round up on a tie //貌似取整(个人自测也符合四舍五入)
* NSRoundDown // Always down //只舍不入(舍去)
* NSRoundUp // Always up //只入不舍(进1法)
* NSRoundBankers // on a tie round so last digit is even
这个 好像也是四舍五入(银行的算法?)
*scale 需要保留的小数位数
元数据未达到该位数时,显示元数据
*raiseOnExactness 提高精确度
*raiseOnOverflow 提高上溢?
*raiseOnUnderflow 提高下溢?
*raiseOnDivideByZero 是否允许被0整除
允许下输入0 崩溃
不允许下输入0 输出NaN
所有NSDecimalNumber对象是不可变的,这意味着已经被创建后不能改变它们的值。
对于NSDecimalNumber 还不是很了解 ,希望有更了解的朋友讨论分享。对于上面有错误的地方,还望不吝赐教!多多交流。
相关文章推荐
- IOS开发之ASIHTTPRequest下载示例
- javascript数据类型的判断
- javascript中的二维数组
- 三角形的css实现(IE6兼容)
- ulimit调优|设置普通用户的ulimit值
- Scala简单计算实例,其在数据分析方面的优势体会
- eclipse自定义右键菜单选项
- may be using a version of Gradle that does not contain the method.
- myBatis批量添加,修改和删除
- PHP中设置时区方法汇总
- 理解Spring Boot
- C#中out和ref之间的区别
- layDate日历控件的调用
- 好用便捷的js日期时间控件代码下载
- Xcode 7 error: Missing iOS Distribution signing identity
- Can not perform this action after onSaveInstanceState
- jdk版本之间的区别(二)
- [Android] AS 中 Gradle 配置运行浅析
- PERL 实现微信登录
- SourceNavigator,代替SourceInsight