iOS小数精度计算误差处理

float a = 0.01;

int b = 99999999;

double c = 0.0;

c = a*b;

NSLog(@"%f",c);    //输出结果为 1000000.000000

NSLog(@"%.2f",c);  //输出结果为 1000000.00

//明显不够精确

在网上找到了一个国内朋友的博客也遇到和我一样的问题,他尝试了如下两种解决方案

将float强制转换为double

c = a*(double)b;

NSLog(@"%f",c);    //输出结果  999999.967648

NSLog(@"%.2f",c);  //输出结果  999999.97

// 明显已经丢失精度

通过和NSString的转换,将计算的原始数据转换为纯粹的double类型的数据,这样的计算精度就可以达到要求了

NSString *objA = [NSString stringWithFormat:@"%.2f", a];

NSString *objB = [NSString stringWithFormat:@"%.2f", (double)b];

c = [objA doubleValue] * [objB doubleValue];

NSLog(@"%.2f",c);  //输出结果  999999.99


最终方案

NSString *decimalNumberMutiplyWithString(NSString *multiplierValue,NSString *multiplicandValue)

{

    NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:multiplierValue];

    NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:multiplicandValue];

    NSDecimalNumber *product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];

    return [product stringValue];

}

NSLog(@"%@",decimalNumberMutiplyWithString([NSString stringWithFormat:@"%f",a], [NSString stringWithFormat:@"%d",b]));

//输出结果  999999.99

你可能感兴趣的:(iOS小数精度计算误差处理)