1. 程式人生 > >63.保留小數位數和精確數字(NSDecimalNumber/NSDecimalNumberHandler)

63.保留小數位數和精確數字(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 四捨六入, 中間值時, 取最近的,保持保留最後一位為偶數
參照一下圖片, 理解上面列舉值:
這裡寫圖片描述

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