ansi中的转换问题

时间:2011-05-31 20:54:04

标签: c floating-point floating-accuracy atof

  

可能重复:
  Floating point inaccuracy examples
  Is JavaScript's Math broken?

我需要将一些数据从txt文件转换为double值,我正在使用此函数: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);
}

3 个答案:

答案 0 :(得分:3)

请参阅this StackOverflow文章。

如果没有额外的工作,浮动将有代表确切值的问题。您将面临两个问题(在链接的帖子中描述) - 实际舍入和格式化。

答案 1 :(得分:2)

简短回答:atof("5.55")永远不会返回此小数部分的精确(意思是精确)表示,因为存在没有这个数字的精确二进制浮点表示,它是无限二进制级分。

如需长篇答案,请参阅http://www.math.umd.edu/~jkolesar/mait613/floating_point_math.pdf

答案 2 :(得分:2)

drhirsch是正确的 - 5.55无法在二进制浮点中精确表示(与1÷7无法用十进制精确表示的方式相同)。

但是,出于您的目的,这不应该是一个问题,因为浮动肯定可以存储5.55 精确到三个地方,这是您拥有的数字。这只意味着您需要在打印时使用正确的格式 - 在这种情况下,%.3g。计算GPA时,您的计算结果仍然准确到三个位置,因为平均值的计算不会导致灾难性的取消。