2014-07-04 96 views
0

在我寫的類中發現問題,我發現19.8851過去到%f,只能得到19.88509,這是因爲float不能保存太多分數部分?當函數的過去時的浮點值再次不相同

// 
// 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 
+0

聽起來像float精度問題,因爲是在浮法只有一個精度至7張十進制數。更多信息:http://stackoverflow.com/a/16359692/1301654 – Will

+0

除特殊情況外,浮點數不準確。 –

+0

(第一行更精確,因爲字面值是雙精度值,而不是浮點數。) –

回答

2

float通常使用IEEE 754-2008的32位基2格式呼叫binary32

作爲該格式基於功率爲2的實施不權力-OF- 10 19.8851的值不是正好是可表示的值。這兩個最接近的選擇是

19.8850994110107421875 (closest to 19.8851) 
19.885101318359375 

最接近的值是從getafloat()返回的。

當這個值被打印出來,除非另有說明,打印到6位過去小數點是

19.885099 
+0

非常好的解釋! – matt

+0

@slboat注意:作爲參考,關於顯示FP的答案(在C中)可能是有用的:http://stackoverflow.com/questions/16839658/printf-width-specificer-to-maintain-precision-of-floating點值/ 19897395#19897395 – chux

1

在計算機上,浮19.8851真的一樣浮19.885099。這就是電腦十進制數字存儲的工作原理。這就是爲什麼你永遠不會使用==來比較它們。你會比較它們在一些小的epsilon;例如:

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

這是第一次聽到!但是睜開眼睛,謝謝! – slboat

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 
+0

這是一個不錯的主意:)但似乎非常有限 – slboat

相關問題