添加Float导致错误的答案

时间:2013-05-03 12:48:50

标签: objective-c

我正在添加两个花车,例如:

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

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:5)

正如评论中已经说明的那样,这是一个浮点精度问题。 float的精度约为7位十进制数,double约为15位十进制数。

Foundation框架还为执行 base-10算术提供NSDecimalNumber类,精度为 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

答案 1 :(得分:2)

请参阅:float vs. double precision

C中的浮点数使用IEEE 754编码。

这种类型的编码使用符号,有效数和指数。

由于这种编码,您永远无法保证您的价值不会发生变化。

此外,有效位数可以稍微改变,因为它是二进制表示,而不是十进制表示。

单精度(浮点数)为您提供23位有效数字,8位指数和1位符号位。

双精度(double)为您提供52位有效数,11位指数和1位符号。