美文网首页
iOS小数精度计算误差处理

iOS小数精度计算误差处理

作者: 浅浅浅丶蓝 | 来源:发表于2018-12-19 14:43 被阅读47次

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小数精度计算误差处理

      本文链接:https://www.haomeiwen.com/subject/hkdjkqtx.html