添加浮点数导致错误答案 [英] Adding Float Causes wrong answer

查看:62
本文介绍了添加浮点数导致错误答案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要添加两个浮点数,例如:

NSString *val1="355.00";NSString *val2="55555550.00";NSString *result=[NSString stringWithFormat:@"%.2f",[val1 floatValue]+[val2 floatValue]];

<块引用>

我得到的答案是 55555908.00 而在计算器上它是55555905.00

我做错了什么?

解决方案

正如评论中已经指出的,这是一个浮点精度问题.float 精度约为 7 位十进制数字,double 精度约为 15 位十进制数字.

Foundation 框架还提供了 NSDecimalNumber 类用于执行 base-10 算术,精度为 38 位十进制数字:

NSString *val1 = @"355.00";NSString *val2 = @"55555550.00";NSDecimalNumber *dec1 = [NSDecimalNumber decimalNumberWithString:val1];NSDecimalNumber *dec2 = [NSDecimalNumber decimalNumberWithString:val2];NSDecimalNumber *decsum = [dec1 decimalNumberByAdding:dec2];NSString *result = [decsum stringValue];//-->55555905

I am adding two floats like:

NSString *val1=@"355.00";
NSString *val2=@"55555550.00";

NSString *result=[NSString stringWithFormat:@"%.2f",[val1 floatValue]+[val2 floatValue]];

The answer i am getting is 55555908.00 while on calculator it is 55555905.00

What i am doing wrong?

解决方案

As already stated in the comments, this is a floating point precision problem. A float has a precision of about 7 decimal digits, a double about 15 decimal digits.

The Foundation framework also provides the NSDecimalNumber class for doing base-10 arithmetic, with a precision of 38 decimal digits:

NSString *val1 = @"355.00";
NSString *val2 = @"55555550.00";
NSDecimalNumber *dec1 = [NSDecimalNumber decimalNumberWithString:val1];
NSDecimalNumber *dec2 = [NSDecimalNumber decimalNumberWithString:val2];
NSDecimalNumber *decsum = [dec1 decimalNumberByAdding:dec2];
NSString *result = [decsum stringValue];
// --> 55555905

这篇关于添加浮点数导致错误答案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆