为啥 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

latex插入图片为啥显示不出来?用Latex运行没有错误,但是pdf文件中不显示

为啥 ~-1 等于 0 而 ~1 等于 -2?

工程布尔比较等于真假,为啥?

为啥 new Array() 不等于 []? [复制]

为啥克隆的结构值仍然等于原始结构

为啥“解释”返回的行不等于count()?