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