iOS中的精度数据处理NSDecimalNumber

double num1 = 1.234566789;
double num2 = 0.0001;
NSLog(@"%f",num1*num2);//结果:0.000123,不精确
//如果对浮点数直接进行普通的运算操作,那么会丢失精度
NSDecimalNumber *dec1 = [[NSDecimalNumber alloc] initWithDouble:num1];
NSDecimalNumber *dec2 = [[NSDecimalNumber alloc] initWithDouble:num2];
//乘法
NSDecimalNumber *r1 = [dec1 decimalNumberByMultiplyingBy:dec2];
NSLog(@"%@",r1);//0.0001234566789
//使用NSDecimalNumber之后,就不会丢失精度了

NSDecimalNumber *dec3 = [NSDecimalNumber decimalNumberWithString:@"1"];
NSDecimalNumber *dec4 = [NSDecimalNumber decimalNumberWithString:@"3"];
//除法
NSDecimalNumber *r2 = [dec3 decimalNumberByDividingBy:dec4];
NSLog(@"%@",r2);//0.3333333333333334
/**
 这是一个NSDecimalNumber的公共协议处理类,可以设置舍入模式以及计算错误的处理;配合NSDecimalNumber来使用.
 
 @param roundingMode 小数保留的类型 NSRoundPlain, 四舍五入
 NSRoundDown, 只舍不入
 NSRoundUp, 只入不舍
 NSRoundBankers 四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数
 @param scale 小数点后保留的位数
 @param exact 精度错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
 @param overflow 溢出错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
 @param underflow 下溢错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
 @param divideByZero 除以0的错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
 @return NSDecimalNumber
 - (instancetype)initWithRoundingMode:(NSRoundingMode)roundingMode scale:(short)scale raiseOnExactness:(BOOL)exact raiseOnOverflow:(BOOL)overflow raiseOnUnderflow:(BOOL)underflow raiseOnDivideByZero:(BOOL)divideByZero
 */
NSDecimalNumberHandler *handler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
//1除以3,保留2位有效数字并四舍五入
NSDecimalNumber *r3 = [dec3 decimalNumberByDividingBy:dec4 withBehavior:handler];
NSLog(@"%@",r3);//0.33
NSDecimalNumber *dec5 = [[NSDecimalNumber alloc] initWithDouble:100.0];
NSDecimalNumber *dec6 = [[NSDecimalNumber alloc] initWithInteger:2];
//加法
NSDecimalNumber *r4 = [dec5 decimalNumberByAdding:dec6];
NSLog(@"%@",r4);//102
NSDecimalNumber *r5 = [dec5 decimalNumberBySubtracting:dec6];
//减法
NSLog(@"%@",r5);//98

你可能感兴趣的:(iOS中的精度数据处理NSDecimalNumber)