为啥 0.9 等于 0.89999997615814208? [复制]
Posted
技术标签:
【中文标题】为啥 0.9 等于 0.89999997615814208? [复制]【英文标题】:Why 0.9 is equal to 0.89999997615814208? [duplicate]为什么 0.9 等于 0.89999997615814208? [复制] 【发布时间】:2014-07-22 19:46:59 【问题描述】:我正在读取一个 txt 文件并填充一个核心数据实体。
在某个时候,我从 TXT 文件中读取了值,值为 @"0.9"
。
现在我将它分配给 CGFloat。
CGFloat value = (CGFloat)[stringValue floatValue];
调试器显示值为 0.89999997615814208 !!!!!!?????
为什么?漏洞?即使 [stringValue floatValue]
是一个 double,将其转换为 CGFloat 也不应该产生这种异常。
【问题讨论】:
阅读此***.com/questions/1661273/… 在这种情况下语言无关紧要 看这个:***.com/questions/10334688/… @HotLicks 虽然我同意这会有所帮助,但我不同意其余的。 链接的副本与这个问题在很多方面都不同,它可能根本不会帮助 OP。 @NikolaiRuhe 我已将关闭调整为一篇我认为在更广泛意义上涵盖此内容的帖子。 【参考方案1】:用于float
的二进制浮点表示无法准确存储该值。所以它使用最接近的可表示值。
它类似于十进制数:不可能用十进制表示三分之一(相反我们使用近似表示,例如 0.3333333)。
【讨论】:
【参考方案2】:因为要以二进制形式存储浮点数,您只能通过将 1/2、1/4、1/8 等分数相加来近似它。对于 0.9(任何许多其他值),没有可以构造的精确表示像这样对分数求和。而如果该值是 0.25,您可以将其精确表示为 1/4。
【讨论】:
【参考方案3】:浮点不精确,查看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
基本上与浮点的工作方式有关,它们不仅存储数字,还存储数学问题。按基数和精度分解。然后它必须通过数学运算组合这两个数字以检索实际值,这并不总是与您分配给它的完全相同。
【讨论】:
以上是关于为啥 0.9 等于 0.89999997615814208? [复制]的主要内容,如果未能解决你的问题,请参考以下文章