63.保留小數位數和精確數字(NSDecimalNumber/NSDecimalNumberHandler)
阿新 • • 發佈:2019-01-27
大家都會在開發中遇到, 一個 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