我正在读取一个 txt 文件并填充一个核心数据实体。
在某些时候,我已经从 TXT 文件中读取了值,值为@"0.9"
.
现在我将它分配给 CGFloat。
CGFloat value = (CGFloat)[stringValue floatValue];
调试器显示值为 0.89999997615814208 !!!!!!?????
为什么?漏洞?即使它[stringValue floatValue]
是双重的,将其转换为 CGFloat 也不应该产生这种异常。
我正在读取一个 txt 文件并填充一个核心数据实体。
在某些时候,我已经从 TXT 文件中读取了值,值为@"0.9"
.
现在我将它分配给 CGFloat。
CGFloat value = (CGFloat)[stringValue floatValue];
调试器显示值为 0.89999997615814208 !!!!!!?????
为什么?漏洞?即使它[stringValue floatValue]
是双重的,将其转换为 CGFloat 也不应该产生这种异常。
用于的二进制浮点表示float
不能准确地存储该值。所以它使用最接近的可表示值。
它类似于十进制数:不可能用十进制表示三分之一(相反,我们使用近似表示,如 0.3333333)。
因为要以二进制形式存储浮点数,您只能通过对 1/2、1/4、1/8 等分数求和来近似它。对于 0.9(任何许多其他值),没有可以从求和分数构建的精确表示像这样。而如果该值是 0.25,您可以将其表示为 1/4。
浮点不精确,请查看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
基本上与浮点的工作方式有关,它们不仅存储数字,还存储数学问题。按基数和精度分解。然后它必须通过数学运算组合这两个数字以检索实际值,这并不总是与您分配给它的完全相同。