您的位置:首页 > 其它

NSDecimalNumber 金额数据的精确计算

2016-02-16 10:17 399 查看
在IOS数据开发中 我们常使用基础数据类型来进行计算,但是float、double等格式下 整数据多位数时常出现系统自动修改值的情况(例如18--》18.000000001和17.99999999),对于一些需要精确计算的数据(例如金额),就需要使用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 还不是很了解 ,希望有更了解的朋友讨论分享。对于上面有错误的地方,还望不吝赐教!多多交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: