添加浮点数导致错误答案 [英] Adding Float Causes wrong answer
本文介绍了添加浮点数导致错误答案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要添加两个浮点数,例如:
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屋!
查看全文