2011-05-31 107 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上的文章。只要你想不一些额外的工作

花车将有较准确的值的问题。你将面临两个问题(在链接文章中描述) - 实际舍入和格式化。