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

大家都会在开发中遇到, 一个 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 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
参照一下图片, 理解上面枚举值:
保留小数位数和精确数字(NSDecimalNumber/NSDecimalNumberHandler)_第1张图片

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

你可能感兴趣的:(保留小数位数和精确数字(NSDecimalNumber/NSDecimalNumberHandler))