-2

我正在读取一个 txt 文件并填充一个核心数据实体。

在某些时候,我已经从 TXT 文件中读取了值,值为@"0.9".

现在我将它分配给 CGFloat。

CGFloat value = (CGFloat)[stringValue floatValue];

调试器显示值为 0.89999997615814208 !!!!!!?????

为什么?漏洞?即使它[stringValue floatValue]是双重的,将其转换为 CGFloat 也不应该产生这种异常。

4

3 回答 3

3

用于的二进制浮点表示float不能准确地存储该值。所以它使用最接近的可表示值。

它类似于十进制数:不可能用十进制表示三分之一(相反,我们使用近似表示,如 0.3333333)。

于 2014-07-22T19:49:00.830 回答
2

因为要以二进制形式存储浮点数,您只能通过对 1/2、1/4、1/8 等分数求和来近似它。对于 0.9(任何许多其他值),没有可以从求和分数构建的精确表示像这样。而如果该值是 0.25,您可以将其表示为 1/4。

于 2014-07-22T19:50:41.430 回答
1

浮点不精确,请查看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

基本上与浮点的工作方式有关,它们不仅存储数字,还存储数学问题。按基数和精度分解。然后它必须通过数学运算组合这两个数字以检索实际值,这并不总是与您分配给它的完全相同。

于 2014-07-22T19:53:47.333 回答