您的位置:首页 > 其它

63.保留小数位数和精确数字(NSDecimalNumber/NSDecimalNumberHandler)

2016-03-25 16:34 567 查看
大家都会在开发中遇到, 一个 float或者 double 类型的小数上, 有时候会有一个精度的丢失, 造成数据不准确. 尤其是在涉及到一些支付的项目, 都要求比较精确, 所以来说一说NSDecimalNumber, 顺便说一下保留小数的方法,NSDecimalNumberHandler 和 Xcode 自带宏定义中的 round().

NSDecimalNumber

//部分创建方法
[[NSDecimalNumber alloc]initWithFloat:2.2];
[[NSDecimalNumber alloc]initWithInt:2];
[[NSDecimalNumber alloc]initWithInteger:2];
[[NSDecimalNumber alloc]initWithBool:0];
NSDecimalNumber *zeroDN = [NSDecimalNumber zero];
NSDecimalNumber *oneDN = [NSDecimalNumber one];

NSDecimalNumber *aDN = [NSDecimalNumber decimalNumberWithString:@"1.00001"];
NSDecimalNumber *bDN = [NSDecimalNumber decimalNumberWithString:@"0.99999"];
NSDecimalNumber *cDN = [aDN decimalNumberByAdding:bDN];
NSDecimalNumber *dDN = [cDN decimalNumberBySubtracting:aDN];
NSDecimalNumber *eDN = [dDN decimalNumberByMultiplyingBy:aDN];
NSDecimalNumber *fDN = [eDN decimalNumberByDividingBy:bDN];//除数为0会 crash

NSLog(@"%@--%@--%@--%@--%@--%@--%@--%@",zeroDN,oneDN,aDN,bDN,cDN,dDN,eDN,fDN);


打印结果: 0–1–1.00001–0.99999–2–0.99999–0.9999999999–1.00001

保留小数位数

NSDecimalNumberHandler

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];

NSDecimalNumber *aDN = [[NSDecimalNumber alloc] initWithFloat:0.125532];
NSDecimalNumber *resultDN = [aDN decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
NSLog(@"%@", resultDN);


打印结果: 0.13

scale: 小数点后保留的位数

RoundingMode: 小数保留的类型

根据官方文档说明, 枚举值分析:

NSRoundPlain, 四舍五入

NSRoundDown, 只舍不入

NSRoundUp, 只入不舍

NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数

参照一下图片, 理解上面枚举值:



round

关于保留小数位数在Xcode 的 math.h 中有自带的宏定义:

double a = round(12.345);
double b = round(1234.5678 * 100) / 100;
NSLog(@"%lf---%lf",a,b);


打印结果: 12.000000—1234.570000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: