【问题标题】:Float comparison浮动比较
【发布时间】:2013-04-03 15:16:33
【问题描述】:

不好意思问这个,但我运行的是 iOS 6.1,下面这行返回 False:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.1)

但以下返回 True:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.1f)

为什么?

【问题讨论】:

  • 双精度浮点比单精度浮点更精确,因此值可能不同。 可能有重复,看这里:stackoverflow.com/questions/15581535/…
  • 在使用 iOS 系统版本时,我检索了完整的字符串(例如,6.1.3,我将其拆分为由 '.' 分隔的部分,然后从值创建一个 NSIndexPath,然后您可以进行比较您的系统版本使用另一个 NSIndexPath 并且不受实数精度问题的影响。抱歉,我现在没有代码,但您应该能够复制我刚才告诉您的方法

标签: ios objective-c


【解决方案1】:

在比较之前将浮点数转换为双精度数。 f 表示小数位数。当您更改小数位数时,您正在比较两个不同的数字

【讨论】:

    【解决方案2】:

    在第一个中,systemVersion 从 float 转换为 double,其值取决于您使用多少位来表示它

    在第二个中,您正在比较两个浮点数

    【讨论】:

      【解决方案3】:

      经过一番阅读,我的理解是这样的:

      • C 将像 1.2 这样的数字视为双精度数,并且如果使用 f 进行修改,例如1.2f 作为浮点数 • 系统不能以 100% 的准确度在内部表示双精度数和浮点数 • 浮点数的表示错误高于双精度数

      因此,将浮点数与双精度数进行比较大多会导致误导性结果。对于非关键系统,比较 2 个浮点数就足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-13
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多