繼承NSNumber,用來(lái)處理精準(zhǔn)計(jì)算。
之前的一個(gè)電商項(xiàng)目中,就經(jīng)常會(huì)遇到這樣一個(gè)問(wèn)題各吨。
使用自帶解析 [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];出現(xiàn)以下問(wèn)題:
解析前:"71.40"
解析后:"71.40000000000001"
當(dāng)時(shí)使用了第三方才處理了這個(gè)問(wèn)題。
今天偶然間看了一篇博客: http://blog.csdn.net/jq2530469200/article/details/52061970
//string轉(zhuǎn)NSDecimalNumber
+ (NSDecimalNumber *)decimalNumberWithString:(nullable NSString *)numberValue;
/*例:將一個(gè)double類型變量轉(zhuǎn)換為string類型*/
- (NSString *)decimalNumberWithDouble:(double)value
{
NSString *doubleString = [NSString stringWithFormat:@"%f", value];
NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:doubleString];
return [decNumber stringValue];
}
//帶有NSDecimalNumberHandler的舍入運(yùn)算
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
NSDecimalNumberHandler:NSDecimalNumber的公共協(xié)議處理類
/**
初始化方法
roundingMode 舍入方式
typedef NS_ENUM(NSUInteger, NSRoundingMode) {
NSRoundPlain, // 四舍五入
NSRoundDown, //向下取舍
NSRoundUp, // 向上取舍
NSRoundBankers
};
scale 小數(shù)點(diǎn)后位數(shù)
exact 精度錯(cuò)誤處理
overflow 溢出錯(cuò)誤處理
underflow 下溢錯(cuò)誤處理
divideByZero 除以0的錯(cuò)誤處理
*/
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero
//精確計(jì)算相加
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
//傳入NSDecimalNumberHandler對(duì)象的相加計(jì)算
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//減
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//乘
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//除
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//以power為底的次方運(yùn)算
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;
//10為底的乘方
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(nullable id <NSDecimalNumberBehaviors>)behavior;