Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 从函数中经过时的浮点值再次不相同_Objective C - Fatal编程技术网

Objective c 从函数中经过时的浮点值再次不相同

Objective c 从函数中经过时的浮点值再次不相同,objective-c,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 ge

问题是在我写的一个类中发现的,我发现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;
}

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

if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等

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

if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等

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

if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等

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

if (fabsf(f1 - f2) < 0.0001) { // close enough, they count as equal
如果(fabsf(f1-f2)<0.0001){//足够接近,则它们相等

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

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

19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从
getafloat()
返回的

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

  19.885099

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

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

19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从
getafloat()
返回的

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

  19.885099

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

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

19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从
getafloat()
返回的

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

  19.885099

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

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

19.8850994110107421875 (closest to 19.8851)
19.885101318359375
最接近的值是从
getafloat()
返回的

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

  19.885099

您是否尝试过使用
%.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

您是否尝试过使用
%.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

您是否尝试过使用
%.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

您是否尝试过使用
%.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


听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)听起来像是浮点精度问题,因为在浮点中只有7位十进制数字的精度。更多信息:除特殊情况外,浮点不精确。(第一行更精确,因为文字值是双精度的,而不是浮点。)这是一个好主意:)但似乎非常有限这是一个好主意:)但似乎非常有限这是一个好主意:)但似乎非常有限这是一个好主意:)但似乎非常有限非常好的解释!@slboat注意:作为参考,关于显示FP的答案(C)可能有用:非常好的解释!@slboat注意:作为参考,答案(C)关于显示FP可能有用:非常好的解释!@slboat注意:作为参考,关于显示FP的答案(C)可能有用:非常好的解释!@slboat注意:作为参考,关于显示FP的答案(C)可能有用: