2011-05-31 151 views
3

可能重複:
Floating point inaccuracy examples
Is JavaScript's Math broken?轉換問題

我需要從txt文件中的一些數據轉換成雙重價值,我使用此功能可實現此:atof。 的問題是,必須轉換值5.550000和ATOF函數返回 5.5499999999999998,這是一個問題,因爲我必須計算出這個數字的GPA和reault是不準確的。 這是從txt文件讀取數據功能:

void readNext(FILE* file,Lab* lab) 
{ 
    char line[100]; 
getline(file,line,100); 
if (strcmp(line,"") == 0) 
{ 
    lab->is_null = 1; 
    return; 
} 
strcpy(lab->date,line); 
getline(file,line,100); 
lab->presence = atoi(line); 
getline(file,line,100); 
strcpy(lab->num_work,line); 
getline(file,line,100); 
lab->mark_work = atof(line); 
getline(file,line,100); 
lab->test_work = atof(line); 
getline(file,line,100); 
lab->current = atof(line); 
getline(file,line,100); 
lab->status_work = atoi(line); 
getline(file,line,100); 
} 
+5

[什麼每臺計算機科學家應該知道關於浮點運算(http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html) – pmg 2011-05-31 20:57:57

回答

2

drhirsch是正確的 - 5.55不能用二進制浮點正確表示(與1÷7不能用十進制精確表示的方式相同)。

但是,你的目的,這不應該是一個問題,因爲浮動肯定可以店5.55 精確到三個地方,這是你的號碼。這意味着打印時需要使用正確的格式 - 在這種情況下,請使用%.3g。當你計算GPA時,你的計算仍然準確到三個地方,因爲平均的計算不會導致災難性的取消。

3

this StackOverflow上的文章。只要你想不一些額外的工作

花車將有較準確的值的問題。你將面臨兩個問題(在鏈接文章中描述) - 實際舍入和格式化。