【问题标题】: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 也不应该产生这种异常。

【问题讨论】:

  • 阅读此stackoverflow.com/questions/1661273/… 在这种情况下语言无关紧要
  • @HotLicks 虽然我同意这会有所帮助,但我不同意其余的。
  • 链接的副本与这个问题在很多方面都不同,它可能根本不会帮助 OP。
  • @NikolaiRuhe 我已将关闭调整为一篇我认为在更广泛意义上涵盖此内容的帖子。

标签: ios cocoa-touch cocoa cgfloat


【解决方案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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-17
        • 2017-12-02
        • 2021-02-14
        • 2019-04-16
        • 2012-04-19
        • 2020-04-27
        • 1970-01-01
        相关资源
        最近更新 更多