处理小数的简单 C 程序



可能的重复项:
浮点数与浮点数文字比较的奇怪输出

因此,程序只是读取一堆数字,并通过除以输入的总数字来找到其平均值。但是,最终结果在最后添加了更多小数,我不确定为什么会这样做。

对于此给定输入:票价:483, 10, 3051, 188, 200, 0

输出应为 786.4但相反,它是786.400024。我做错了什么?提前谢谢伙计们。

int main(int argc, char** argv)
{
    int averageOfNumbers = 0;
    printf("Enter the sequence of numbers:");
    int nextNumber;
    float numberCounter = 0;
    do
    {
            scanf("%d", &nextNumber);
            if(nextNumber > 0)
            {
                    numberCounter++;
                    averageOfNumbers += nextNumber;
            }
    } 
    while(nextNumber > 0);
    float finalAverage = (float) (averageOfNumbers/numberCounter);
    averageOfNumbers = averageOfNumbers/numberCounter;
    printf("Average of the numbers in the sequence is %fn", finalAverage);

}

浮点数提供对实数的精确但不精确的近似。 (精度取决于它们的大小:您正在使用的浮点类型中有多少位精度可用。

IEEE 754浮点数(许多计算机上使用的一种非常流行的表示形式)使用二进制。这意味着二进制分数(如 1/2、1/4、1/8 及其组合:3/8、5/16 等)被精确表示(在可用精度位数的限制内)。不基于二的幂的分数不能完全表示。

数字 1/10 或 0.1 没有确切的表示形式。 当您在机器中输入 0.1 时,它会转换为具有许多二进制数字的值,该值接近 0.1。 当你用printf或你有什么东西打印回来时,你会再次得到0.1,因为printf功能使它四舍五入,所以看起来0.1被准确地表示了:0.1进入机器,天哪,0.1出来了。 假设需要 10 位十进制数字才能看到0.1与实际值之间的差异,但您只打印到 8 位。好吧,当然它会显示为0.1.您的浮点打印例程已切断错误!

C printf 中的%f转换说明符将对较大的数字使用更多数字,因为它使用超过小数点的固定位数,默认值为 6。因此,例如 0.002 将打印为 0.002000。但数字123456将打印为 123456.000000。 就数量级而言,数字越大,打印的数字就越重要。当您使用 %f 打印 786.4 时,您实际上要求 9 位十进制数字的精度。786 整数部分有三个,然后是六个。

您正在使用float很可能是 32 位 IEEE 754 浮点数。这只有 24 位精度。(1 位用于符号,7 位用于二进制指数,剩下 24。 24 位只相当于大约 7 位十进制数字的精度!

因此,您要求机器将 786.4(它的表示形式不精确,请记住!)打印为九位有效数字,从浮点表示形式打印出来,该浮点表示仅适用于大约 7 个十进制有效数字。您要求另外两位不存在的精度,因此得到两个错误数字。

因此,您可以做的是使用更广泛的类型,如double和/或更改打印结果的方式。不要要求那么多重要数字。例如,尝试%.3f(小数点后三位数字)。

顺便说一下,C 中的 float 类型应该很少使用。您通常希望使用类型 doublefloat有其用途,例如节省大型数组中的空间。

点类型不能完全准确地表示所有数字 - 许多数字只能用浮点近似表示; 这意味着给定足够多的有效数字,您最终会看到那些无法整齐地融入表示的数字的精度损失。

使用浮点

数据类型的问题在于它是浮点类型中最不准确的。 (C 和 C++ 中的默认浮点类型是双精度型 - 这是您应该使用的浮点类型;您应该避免使用 float,除非您有令人信服的理由使用它)。 在现代 32 位桌面平台上,对于某些近似数字,浮点数可能只能精确到 6-7 个有效数字左右,同一平台上的双精度可能精确到相同数字的大约 13-14 平方英尺(注意:这是有效数字,而不是小数位!

我强烈建议你花时间阅读浮点数是如何工作的(把它输入谷歌,你会发现大量的解释!);了解它们在内部是如何表示的将有助于你成为一个更好的程序员

使用双精度将解决您的问题。浮子的准确性和精度是问题的原因。

最新更新