【问题标题】:Problem with calculating floats计算浮点数的问题
【发布时间】:2010-05-21 04:48:36
【问题描述】:

奇怪的情况,当执行以下代码行时:

const float a = 47.848711;
const float b = 47.862952;
float result = b - a;

我得到 (NSLog %.10f) 结果 = 0.0142440796。

我预计会得到 0.0142410000。

发生了什么事?

【问题讨论】:

标签: iphone objective-c


【解决方案1】:

经典!

What Every Computer Scientist Should Know About Floating-Point Arithmetic

(基本上,浮点数可能不准确;wikipedia)。

【讨论】:

    【解决方案2】:

    如果我问你以下问题怎么办:

    const int a = 1.3;
    const int b = 2.7;
    int result = b - a;
    

    我得到 (NSLog %d) 结果 = 1。

    我预计会得到 1.4。怎么回事?

    在这种情况下,答案是显而易见的,对吧? 1.3 不是整数,因此存储在a 中的实际值是 1,而存储在b 中的值不是 2.7,而是 2。当我从 2 中减去 1 时,我得到的正好是 1 ,这是观察到的答案。如果到目前为止你和我在一起,请继续阅读。


    在您的示例中也发生了完全相同的事情。 47.848711 不是单精度浮点数,因此最接近的浮点值存储在 a 中,确切地说是:

    a = 47.8487091064453125
    

    同样,b 中存储的值是最接近47.862952 的浮点值,即:

    b = 47.86295318603515625
    

    当你减去这些数字得到result,你得到:

      47.86295318603515625
    - 47.8487091064453125
    ----------------------
       0.01424407958984375
    

    当您将该值四舍五入到 10 位以打印出来时,您会得到:

       0.0142440796
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2011-01-10
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多