NSDecimalNumber

继承NSNumber,用来处理精准计算。
之前的一个电商项目中,就经常会遇到这样一个问题。
使用自带解析 [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];出现以下问题:
解析前:"71.40"
解析后:"71.40000000000001"
当时使用了第三方才处理了这个问题。
今天偶然间看了一篇博客: http://blog.csdn.net/jq2530469200/article/details/52061970

//string转NSDecimalNumber
+ (NSDecimalNumber *)decimalNumberWithString:(nullable NSString *)numberValue;
/*例:将一个double类型变量转换为string类型*/
- (NSString *)decimalNumberWithDouble:(double)value
{
NSString *doubleString = [NSString stringWithFormat:@"%f", value];
NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:doubleString];
return [decNumber stringValue];
}

//带有NSDecimalNumberHandler的舍入运算
- (NSDecimalNumber *)decimalNumberByRoundingAccordingToBehavior:(nullable id )behavior;

NSDecimalNumberHandler:NSDecimalNumber的公共协议处理类
/**
初始化方法
roundingMode 舍入方式
typedef NS_ENUM(NSUInteger, NSRoundingMode) {
NSRoundPlain, // 四舍五入
NSRoundDown, //向下取舍
NSRoundUp, // 向上取舍
NSRoundBankers
};
scale 小数点后位数
exact 精度错误处理
overflow 溢出错误处理
underflow 下溢错误处理
divideByZero 除以0的错误处理
*/
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero

//精确计算相加
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber;
//传入NSDecimalNumberHandler对象的相加计算
- (NSDecimalNumber *)decimalNumberByAdding:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id )behavior;
//减
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberBySubtracting:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id )behavior;
//乘
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByMultiplyingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id )behavior;
//除
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber;
- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber withBehavior:(nullable id )behavior;
//以power为底的次方运算
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power;
- (NSDecimalNumber *)decimalNumberByRaisingToPower:(NSUInteger)power withBehavior:(nullable id )behavior;
//10为底的乘方
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power;
- (NSDecimalNumber *)decimalNumberByMultiplyingByPowerOf10:(short)power withBehavior:(nullable id )behavior;

你可能感兴趣的:(NSDecimalNumber)