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
网友评论