1

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

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

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

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

我做错了什么?

4

2 回答 2

5

如评论中所述,这是一个浮点精度问题。Afloat的精度约为 7 位十进制数字,adouble约为 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
于 2013-05-03T13:09:29.970 回答
2

请参阅:浮点与双精度

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

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

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

此外,有效数字的数量可能会略有变化,因为它是二进制表示,而不是十进制表示。

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

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

于 2013-05-03T13:03:05.427 回答