【问题标题】:Trouble with floats in Objective-CObjective-C 中的浮点数问题
【发布时间】:2010-11-14 16:18:53
【问题描述】:

我有一个小问题,我找不到解决办法!

我的代码是(这只是一个示例代码,但我的原始代码是这样的):

float x = [@"2.45" floatValue];


for(int i=0; i<100; i++)
    x += 0.22;

NSLog(@"%f", x);

输出是 52.450001 而不是 52.450000 !

我不知道,因为会发生这种情况!

感谢您的帮助!

~已解决~

谢谢大家!是的,我已经用double类型解决了!

【问题讨论】:

  • hanno 的链接解释了这个问题。这个特殊的例子不会出现在 double 而不是 float 的情况下,但存在相同的基本缺陷。
  • 不过,Double 会因其他数字而中断。试试十进制。

标签: objective-c cocoa floating-point floating-point-precision


【解决方案1】:

浮点数是具有一定精度的数字表示。并非每个值都可以用这种格式表示。参见here

你可以很容易地想到为什么会这样:在区间 (1..1) 中有无限数量的数字,但浮点数只有有限数量的位来表示 (- MAXFLOAT..MAXFLOAT)。

更恰当地说:在 32 位整数表示中,有无数个整数要表示,但有无数个实数值无法在 32 位或 64 位的有限表示中完全表示。因此,不仅有最高和最低可表示的实际值的限制,而且对准确性也有限制。

那么为什么浮点数后面的数字很少呢?因为表示是基于二进制而不是十进制,所以其他数字比十进制更容易表示。

【讨论】:

    【解决方案2】:

    浮点数并不总是很容易被计算机表示。这会导致某些数字不准确。

    就像我问你十进制的 1/3 是多少。不管你怎么努力,你都无法告诉我它是什么,因为十进制不能准确地描述这个数字。

    浮点数不能准确描述一些十进制数。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2016-12-03
      相关资源
      最近更新 更多