为什么0.9等于0.89999997615814208?

时间:2014-07-22 19:46:59

标签: ios cocoa-touch cocoa cgfloat

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

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

现在我将它分配给CGFloat。

CGFloat value = (CGFloat)[stringValue floatValue];

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

为什么呢?错误?即使事物[stringValue floatValue]是双重的,将它投射到CGFloat也不应该产生这种异常。

3 个答案:

答案 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

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