Objective-C浮点加法错误

Objective-C浮点加法错误,objective-c,floating-point,Objective C,Floating Point,可能重复: 我已经把这个问题分解成尽可能简单的问题。请随意尝试同样的事情,并告诉我如果你得到同样的错误,你可能会有什么解决方案。我已经在几台电脑上试过了 float total = 200000.0f + 154196.8f; NSLog(@"total: %f", total); 输出为: total: 354196.812500 如果有任何人有任何合乎逻辑的解释,请随意分享。我建议你温习一下你的花车 如果您需要更高的精度,请使用双精度 另外我建议你把彩车刷一下 如果您需要更高的精度

可能重复:

我已经把这个问题分解成尽可能简单的问题。请随意尝试同样的事情,并告诉我如果你得到同样的错误,你可能会有什么解决方案。我已经在几台电脑上试过了

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

total: 354196.812500

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

我建议你温习一下你的花车

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


另外

我建议你把彩车刷一下

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

另外

提示:

long double total = 200000.0 + 154196.8;
NSLog(@"total: %Lf", total);
在我的机器上打印正确的值。
32位浮点具有23位尾数,最接近的值为0.5+0.25+0.125。
您应该使用更多的位来获得正确的表示形式。

提示:

long double total = 200000.0 + 154196.8;
NSLog(@"total: %Lf", total);
在我的机器上打印正确的值。
32位浮点具有23位尾数,最接近的值为0.5+0.25+0.125。
您应该使用更多的位来获得正确的表示。

有关所有深入的理解,请参阅。简单的回答是,所有浮点表示法的精度都有限制,可以用小数位数表示的内容可能无法用二进制位数表示(特别是不能用浮点格式)

请注意,
double
可以改善情况,但它并不是万灵药。即使使用
double
,小的舍入误差也是很常见的。当你期望得到2时,你很容易得到1.9999999。

请参阅以获得所有深刻的理解。简单的回答是,所有浮点表示法的精度都有限制,可以用小数位数表示的内容可能无法用二进制位数表示(特别是不能用浮点格式)


请注意,
double
可以改善情况,但它并不是万灵药。即使使用
double
,小的舍入误差也是很常见的。当您期望2时,您可能很容易得到1.9999999。

为什么使用与xcode无关的
xcode
标记?发生这种情况时,我使用的环境是xcode。下次尽量不要换别人的帖子。不行。实现最多是OSX和GCC/clang(以两者为准)。问题与您使用另一个IDE相同。这与Objective-C或环境无关-这只是浮点数学的工作方式。@KrisGellci 2000 rep上的“编辑”函数存在是有原因的。下一次不要太冒失和无知。为什么要用与xcode无关的
xcode
标记呢?发生这种情况时,我使用的是xcode环境。下次尽量不要换别人的帖子。不行。实现最多是OSX和GCC/clang(以两者为准)。问题与您使用另一个IDE相同。这与Objective-C或环境无关-这只是浮点数学的工作方式。@KrisGellci 2000 rep上的“编辑”函数存在是有原因的。下次尽量不要太激进和无知。Double works,我知道浮点有不准确的地方,我只是惊讶于我不能做一个简单的。80+.00Double works,我知道浮点有不准确的地方,我只是很惊讶我不能做一个简单的计算。80+0.00位会更接近,但即使是10000位的二进制浮点数也不能表示。这是问题的症结所在。不能用二进制浮点表示4/5,因为分母必然总是2的幂。这就像试图将1/3精确地表示为以10为基数的小数点。0.3333收敛,但永远不会到达。更多位会更接近,但即使是10000位二进制浮点数也无法表示。这是问题的症结所在。不能用二进制浮点表示4/5,因为分母必然总是2的幂。这就像试图将1/3精确地表示为以10为基数的小数点。0.3333会收敛,但永远不会到达。