2012-04-03 86 views
0

爲什麼atof將「14718.5084」舍入爲14718.5? 有沒有辦法阻止(即得到整個號碼14718.5084)?函數atof()將其結果舍入爲整數部分

代碼:

double latitude=atof("14718.5084"); 
std::cout <<"latitude test "<<latitude<< "\n"; 

,輸出是:

latitude test 14718.5 

感謝

+0

你指的是atof吧? – 2012-04-03 11:26:22

+0

我添加了代碼。 – user1106106 2012-04-03 11:33:41

回答

2

因爲atof返回double,這你轉換爲float。 (我猜這就是你在做什麼)。

此外,14718.5084不能完全表示。例如:

double f = 14718.5084; 

給我f == 14718.508400000001

+0

二進制沒有任何denary像1/10或1/100所以它的四捨五入。 – 2012-04-03 12:16:37

6

試試這個代碼,看看它正是你想要的:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char input [256]; 
    printf("Enter something: "); 
    gets(input); 
    printf("Result: %f\n", atof(input)); 
    return 0; 
} 

也許你在打印時失去了數字...

試試這個:

double latitude=atof("14718.5084"); 
std::cout.precision(9); 
std::cout <<"latitude test "<< latitude << "\n"; 
+0

+1因爲打印 – 2012-04-03 11:31:47

+0

我現在添加了我的代碼。謝謝,但我不認爲印刷是我的問題 – user1106106 2012-04-03 11:34:56

+0

請參閱附加代碼,打印它是;) – HWende 2012-04-03 11:40:04

1
#include <limits> 


    double latitude=atof("14718.5084"); 
    typedef std::numeric_limits<double> dbl; 
    std::cout <<"latitude test "; 
    std::cout.precision(dbl::digits10); 
    std::cout<<latitude<< "\n"; 
0

我有一個稍微不同的問題,但它符合標題。 atof看起來像四捨五入到整數部分,它不是一個輸出精度問題。 我的解決方案是更改我的Ubuntu安裝的區域設置。 小數由逗號而不是點分隔。

試試這個代碼(逗號而不是點):

double latitude=atof("14718,5084"); 
std::cout <<"latitude test "<<latitude<< "\n"; 

如果輸出正確的浮點數(也許用點分隔),你應該改變你的區域設置爲英語或用逗號浮點值工作在您的數據中(例如德語區域設置)

0

區域設置可能會添加更多混淆,顯然它們在整個工具鏈中並不總是有效。

E.g.我遇到了這樣一個問題,即由atof(例如0.85 - > 0)將分隔值四捨五入爲int,因爲語言環境需要逗號分隔的值。但同時,調試器IDE也不接受逗號分隔的值(例如,在調試過程中嘗試更改變量值時)。

+0

很遺憾地看到這個答案downvoted。 +1,因爲我猜它可能會幫助一些搜索標題的人。 – Micka 2015-01-10 21:55:21