从函数过去时浮点值不再相同

时间:2014-07-04 01:44:05

标签: objective-c

问题是在我写的一个类中找到的,我发现19.8851过去到了%f,只得到了19.88509,这是因为浮点数不能保存过于分数的部分吗?

//
//  main.m
//  0.6 the_float_not_corrert
//
//  Created by Sen on 7/4/14.
//  Copyright (c) 2014 SLboat. All rights reserved.
//

#import <Foundation/Foundation.h>

/**
 *  for get a float value from function
 *
 *  @return a flaot value
 */
float getafloat(){

    return 19.8851;
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSLog(@"const 19.8851 is %f",19.8851);
        NSLog(@"19.8851 is %f",getafloat());
        float byValue = 19.8851;
        NSLog(@"19.8851 pass in value is %f",byValue);

    }
    return 0;
}

这就是我得到的

2014-07-04 09:42:07.508 0.6 the_float_not_corrert[11540:303] const 19.8851 is 19.885100
2014-07-04 09:42:07.510 0.6 the_float_not_corrert[11540:303] 19.8851 is 19.885099
2014-07-04 09:42:07.511 0.6 the_float_not_corrert[11540:303] 19.8851 pass in value is 19.885099
Program ended with exit code: 0

3 个答案:

答案 0 :(得分:2)

float通常使用IEEE 754-2008 32位base 2格式调用实现binary32

由于此格式基于2的幂而不是10的幂,因此19.8851的值不是完全可表示的。最接近的两个选择是

19.8850994110107421875 (closest to 19.8851)
19.885101318359375

最近的值是从getafloat()返回的。

打印此值时,除非另有说明,否则打印到小数点后的6个位置

  19.885099

答案 1 :(得分:1)

在计算机上,浮动19.8851实际上 与浮动19.885099相同。这就是计算机十进制数存储的工作原理。这就是为什么你永远不会使用==来比较它们。你可以将它们与一些小epsilon进行比较;例如:

if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal

答案 2 :(得分:0)

您是否尝试使用%.4f

请看下面的例子:

@autoreleasepool {

    NSLog(@"const 19.8851 is %.4f",19.8851);
    NSLog(@"19.8851 is %.4f",[self getafloat]);
    float byValue = 19.8851;
    NSLog(@"19.8851 pass in value is %.4f",byValue);  
}

输出:

2014-07-03 20:53:34.297 TestApp[721:907] const 19.8851 is 19.8851
2014-07-03 20:53:34.304 TestApp[721:907] 19.8851 is 19.8851
2014-07-03 20:53:34.305 TestApp[721:907] 19.8851 pass in value is 19.8851