3

可能的重复:
浮点不准确示例
JavaScript 的数学是否损坏?

我需要将 txt 文件中的一些数据转换为双精度值,我为此使用了这个函数: atof 。问题是必须转换的值是 5.550000,而 atof 函数返回 5.5499999999999998,这是一个问题,因为我必须用这个数字计算 GPA,而结果并不精确。这是从 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);
}
4

3 回答 3

3

请参阅这篇StackOverflow 文章。

如果没有一些额外的工作,浮点数将在表示您想要的精确值时出现问题。您将面临两个问题(在链接的帖子中描述) - 实际舍入和格式。

于 2011-05-31T21:00:22.880 回答
2

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

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

于 2011-05-31T21:34:11.083 回答
2

drhirsch是正确的 - 5.55 不能用二进制浮点数精确表示(就像 1 ÷ 7 不能用十进制精确表示一样)。

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

于 2011-06-01T04:35:06.787 回答