我在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〃;。对于整数和定点类型,没有错误。