NSDecimalNumber簡介
顧名思義這是一個十進制數(shù)字類笔横,繼承自NSNumber,蘋果針對浮點類型計算精度問題提供出來的計算類咐吼,基于十進制的科學計數(shù)法來計算吹缔,同時可以指定舍入模式,一般用于貨幣計算锯茄。
初始化方法
/**
創(chuàng)建并返回一個十進制對象
@param dcm 十進制的結構體
*/
- (instancetype)initWithDecimal:(NSDecimal)dcm;
/**
@param mantissa 十進制尾數(shù) (如:123)
@param exponent 指數(shù) (如:3)
@param flag 是否為負 (如:YES)
return 十進制數(shù)字對象 (如:-123000)
*/
- (instancetype)initWithMantissa:(unsigned long long)mantissa
exponent:(short)exponent
isNegative:(BOOL)flag;
/**
@param numberValue 數(shù)字字符串
*/
- (instancetype)initWithString:(nullable NSString *)numberValue;
/**
@param numberValue 數(shù)字字符串,可以根據locale來解析 (如:@"123,456")
@param locale 解析<numberValue>的字典(特別是NSLocaleDecimalSeparator:分割整數(shù)跟小數(shù))
(如 @{NSLocaleDecimalSeparator:@","})
@return 十進制數(shù)字對象 (如:123.456)
*/
- (instancetype)initWithString:(nullable NSString *)numberValue
locale:(nullable id)locale;
NSDecimalNumberHandler
這是一個NSDecimalNumber的公共協(xié)議處理類厢塘,可以設置舍入模式以及計算錯誤的處理;配合NSDecimalNumber來使用,將這個類的實例當做NSDecimalNumber相應API的參數(shù)來控制數(shù)字處理的結果俗冻。
/**
初始化方法
@param roundingMode 舍入方式
@param scale 小數(shù)點后舍入值的位數(shù)礁叔。
@param exact 精度錯誤處理;YES:如果出現(xiàn)錯誤迄薄,將引發(fā)異常琅关,NO:忽略錯誤并將控制權放回給調用者。
@param overflow 溢出錯誤處理讥蔽;YES:如果出現(xiàn)錯誤涣易,將引發(fā)異常,NO:忽略錯誤并將控制權放回給調用者冶伞。
@param underflow 下溢錯誤處理新症;YES:如果出現(xiàn)錯誤,將引發(fā)異常响禽,NO:忽略錯誤并將控制權放回給調用者徒爹。
@param divideByZero 除以0的錯誤處理;YES:如果出現(xiàn)錯誤芋类,將引發(fā)異常隆嗅,NO:忽略錯誤并將控制權放回給調用者。
@return NSDecimalNumberHandler對象
*/
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode
scale:(short)scale
raiseOnExactness:(BOOL)exact
raiseOnOverflow:(BOOL)overflow
raiseOnUnderflow:(BOOL)underflow
raiseOnDivideByZero:(BOOL)divideByZero
/**
快速構造方法
roundingMode:NSRoundPlain
scale:全精度
exact:NO
overflow:NO
underflow:NO
divideByZero:NO
*/
+ (NSDecimalNumberHandler *)defaultDecimalNumberHandler;
NSRoundingMode的幾種方式:
- NSRoundPlain:四舍五入
- NSRoundDown:只舍不入
- NSRoundUp:只入不舍
- NSRoundBankers: 在四舍五入的基礎上加了一個判斷:當最后一位為5的時候侯繁,只會舍入成偶數(shù)胖喳。比如:1.25不會返回1.3而是1.2,因為1.3不是偶數(shù)贮竟。
官方文檔提供的圖片
加法運算
/**
@param decimalNumber 相加的十進制對象
*/
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
/**
@param decimalNumber 相加的十進制對象
@param behavior NSDecimalNumberHandler對象
*/
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber
withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior
減法運算
/**
@param decimalNumber 減去的十進制對象
*/
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
/**
@param decimalNumber 減去的十進制對象
@param behavior NSDecimalNumberHandler對象
*/
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber
withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
乘法運算
/**
@param decimalNumber 相乘的十進制對象
*/
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
/**
@param decimalNumber 相乘的十進制對象
@param behavior NSDecimalNumberHandler對象
*/
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber
withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
除法運算
/**
@param decimalNumber 除以的十進制對象
*/
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
/**
@param decimalNumber 除以的十進制對象
@param behavior NSDecimalNumberHandler對象
*/
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber
withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
次方運算
/**
@param power 指數(shù)
return 調用者的power次方
*/
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;
/**
@param power 指數(shù)
@param behavior NSDecimalNumberHandler對象
return 調用者的power次方
*/
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power
withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
10為底的乘方運算
/**
調用者乘以10的power次方
@param power 10的指數(shù)
*/
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;
/**
調用者乘以10的power次方
@param power 10的指數(shù)
@param behavior NSDecimalNumberHandler對象
*/
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power
withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
舍入運算
/**
@param decimalNumber NSDecimalNumberHandler對象
*/
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
總結
之前被這個NSRoundingMode狠狠的坑了一把丽焊,把NSRoundBankers當做四舍五入,最后運算出來的結果有時跟后臺差0.1咕别,查了好久技健,最后在蘋果官方文檔上才發(fā)現(xiàn)模式用錯了??。所以在這里我主要把一系列的API跟參數(shù)進行解釋顷级,方便大家去理解運用凫乖。