Objective-c NSNumber floatValue返回错误的值



我在macOS上,objective-c。不是swift,不是iOS。

为了通过一个浮动,我暂时需要让它成为某个点上的对象:

NSNumber* floatNumber = @.5;
// Other stuff ...
float myFloat = [floatNumber floatValue]; // --> (float) 0.5

然而,使用执行与上述相同的操作

NSNumber* floatNumber = @.4;
// Other stuff ...
float myFloat = [floatNumber floatValue]; // --> (float) 0.400000006

这打破了其余的,因为我需要相同的浮动值0.4

我已经试过绕过

floorf([floatNumber floatValue] *100)/100;  // --> (float) 0.400000006

有人能解释这种行为并告诉我如何解决吗

此行为与浮点错误有关。

根据定义,浮点错误无法消除,并且,在最好的,只能管理。

https://en.wikipedia.org/wiki/Floating-point_error_mitigation

您看到的错误与浮点只能存储有限的精度有关,因此在一定数量的位置后,它将开始看起来像噪声。几乎可以肯定的是,在0.5的第一个例子中存在一些错误,但它非常小,以至于在打印时没有显示出来。

改善这种情况的一种方法是使用double而不是float。在64位体系结构(即任何现代的体系结构(上,NSNumber内部将浮点值存储为双精度。因此,如果您使用doubleValue而不是floatValue,您将获得更高精度的版本。

请注意,仍然会有错误。这只是浮点数的方式。你可以在浮点或双精度中存储0.4,但实际上这意味着";非常接近0.4〃;。对于整数和定点类型,没有错误。

最新更新