NSDecimalNumber是NSNumber的子類,比NSNumber的功能更為強大,可以指定一個數的冪,四舍五入等操作。NSString類型轉化成CGFloat、CGDouble類型,使用floatValue、doubleValue 等方法結果精度不高的情況。例如 @"8" -> 7.99999? ? @"1.0" -> 1.00001 @"12.9"->12.8999
由于NSDecimalNumber精度較高,所以會比基本數據類型費時,所以需要權衡考慮,蘋果官方建議在貨幣以及要求精度很高的場景下使用。?
一、一些科學計數法的簡單方法。
?//一個關于科學計數法的方法:參數 1.mantissa 實數 2.exponent 指數 3.flag 正負
- (instancetype)initWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag;
+ (NSDecimalNumber *)decimalNumberWithMantissa:(unsigned long long)mantissa exponent:(short)exponent isNegative:(BOOL)flag;
例:mantissa = 6 ,exponent = 2 ,flag = false? ? 結果:6*10^2 = 600。
//一個科學計數法的初始化方法:numberValue 字符串(詳情見官方文檔)
- (instancetype)initWithString:(nullable NSString *)numberValue;
+ (NSDecimalNumber *)decimalNumberWithString:(nullable NSString *)numberValue;
例:NSDecimalNumber *a = [[NSDecimalNumber alloc] initWithString:@"-4e3"]; 輸出:-4000。?
二、NSDecimalNumber 對象值進行操作
//一些基本賦值
+ (NSDecimalNumber *)zero; //Returns an NSDecimalNumber object equivalent to the number 1.0.
+ (NSDecimalNumber *)one; //Returns an NSDecimalNumber object equivalent to the number 0.0.
+ (NSDecimalNumber *)minimumDecimalNumber; //-340282366920938463463374607431768211455
+ (NSDecimalNumber *)maximumDecimalNumber;+ (NSDecimalNumber *)notANumber; //Returns an NSDecimalNumber object that specifies no number.非數字
例:enum {? NSRoundPlain,//四舍五入?
NSRoundDown,//只舍不入?
NSRoundUp,//只入不舍NSRoundBankers?
//近似于圓};
typedef NSUInteger NSRoundingMode;
//NSDecimalNumberBehaviors對象的創建? 參數 1.RoundingMode 一個取舍枚舉值 2.scale 處理范圍 3.raiseOnExactness? 精確出現異常是否拋出原因 4.raiseOnOverflow? 上溢出是否拋出原因? 4.raiseOnUnderflow? 下溢出是否拋出原因? 5.raiseOnDivideByZero? 除以0是否拋出原因。
NSDecimalNumber * a = [NSDecimalNumber decimalNumberWithString:@"2.5301"];
NSDecimalNumber * b = [NSDecimalNumber decimalNumberWithString:@"7.5001"];
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2? raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]
//加法運算? 參數 behavior 對的到的結構做一些限制(后面有說明)
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id)behavior;
NSDecimalNumber *c = [a decimalNumberByAdding:b];? 結果:10.032 NSDecimalNumber *c = [a decimalNumberByAdding:b withBehavior:roundingBehavior]; 結果:10.03
//減法運算
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id)behavior;
NSDecimalNumber *c = [a decimalNumberBySubtracting:b]; 結果:-4.97 NSDecimalNumber *c = [a decimalNumberBySubtracting:b withBehavior:roundingBehavior]; 結果:-4.97
//乘法運算
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id)behavior;
NSDecimalNumber *c = [a decimalNumberByMultiplyingBy:b]; 結果:18.97600301
NSDecimalNumber *c = [a decimalNumberByMultiplyingBy:b withBehavior:roundingBehavior]; 結果:18.98
//除法運算
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id)behavior;
NSDecimalNumber *c = [a decimalNumberByDividingBy:b]; 結果:0.3373421687710830522259703203957280
NSDecimalNumber *c = [a decimalNumberByDividingBy:b withBehavior:roundingBehavior]; 結果:0.34
//a的n次方 參數?
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(nullable id)behavior;
NSDecimalNumber *c = [a decimalNumberByRaisingToPower:3];? 結果:16.196197345901
NSDecimalNumber *c = [a decimalNumberByRaisingToPower:3 withBehavior:roundingBehavior]; 結果:16.2
//指數運算?
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(nullable id)behavior;
//四舍五入
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id)behavior;
NSDecimalNumber *c = [a decimalNumberByRoundingAccordingToBehavior:roundingBehavior]; 結果:2.53
//兩數比較
- (NSComparisonResult)compare:(NSNumber *)decimalNumber;
NSLog(@"%ld",(long)[a compare:b]); 結果 -1.
//設置默認的behaviors對象
+ (void)setDefaultBehavior:(id)behavior;+ (id)defaultBehavior;
注:后面全部設為 NO 的話,默認只進行后兩位的的四舍五入操作,再多就是直接舍去。 需要更精確的四舍五入需要scale后面參數某個改為YES。