【问题标题】:NSNumber floatValue not equal to NSNumber valueNSNumber floatValue 不等于 NSNumber 值
【发布时间】:2011-02-18 11:04:49
【问题描述】:

第一次发帖。 NSNumber 的 floatValue 方法有问题——不知何故,它返回了一个不精确的数字。这就是问题所在:我将一堆 NSNumbers 存储在一个数组中,如下所示:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

然后我尝试检索第一个值(例如): NSNumber n = (NSNumber) [a objectAtIndex:0]; CGFloat f = [n floatValue];

在调试器中,n 显示的值为 0.04(在汇总列中),但 f 显示的值为 0.0399999991。我在这里做错了什么?

谢谢大家。

【问题讨论】:

    标签: nsnumber cgfloat


    【解决方案1】:

    你没有做错任何事。这也不是NSNumberCGFloat 的问题。浮点数非常普遍,它基于 2 的幂,而不是 10 的幂。您应该阅读this definitive articleWikipedia article

    关键是,标准浮点数只能准确表示一个数字,即 1/2、1/4、1/8、...之和。 1/10 不是。所以你不能用标准浮点数完全准确地表示 0.1。

    如果你真的需要处理它,有处理有理分数或十进制浮点数的例程。

    【讨论】:

    • 这样就搞定了,谢谢。换句话说,除非你先将它们四舍五入,否则永远不要与浮点数进行 == 比较。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2013-03-22
    相关资源
    最近更新 更多