1

可能重复:
Objective-C 中的浮点数问题

我已将这个问题分解为尽可能简单。随意尝试相同的事情并告诉我您是否遇到相同的错误以及您可能有什么解决方案。我已经在几台电脑上试过了。

float total = 200000.0f + 154196.8f;
NSLog(@"total: %f", total);

输出是:

total: 354196.812500

如果有人有任何合乎逻辑的解释,请随时分享。

4

3 回答 3

13

我建议你刷上你的花车

http://www.altdevblogaday.com/2012/05/20/thats-not-normalthe-performance-of-odd-floats/

如果您需要更高的精度,请使用双精度。

另外http://randomascii.wordpress.com/2012/03/08/float-precisionfrom-zero-to-100-digits-2/

于 2012-12-19T15:17:38.487 回答
7

请参阅每个程序员应该了解的浮点运算知识,以获得所有深入的理解。简短的回答是,所有浮点表示对其精度都有限制,并且可以用少量十进制数字表示的事物可能无法用少量二进制数字表示(特别是不能以浮点格式表示) )。

请注意,虽然double可以改善事情,但它不是灵丹妙药。有小的舍入误差是很常见的,即使是double. 当您期望 2 时,您可能很容易得到 1.99999999。

于 2012-12-19T15:21:12.733 回答
3

暗示:

long double total = 200000.0 + 154196.8;
NSLog(@"total: %Lf", total);

在我的机器上打印正确的值。
一个 32 位浮点数有一个 23 位尾数,最接近的值为 0.5+0.25+0.125。
您应该使用更多位来获得正确的表示。

于 2012-12-19T15:20:23.080 回答