-1

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

所以程序只是读入一堆数字,然后通过除以输入的总数来找到平均值。但是,最终结果最后会增加几个小数,我不确定为什么会这样。

对于这个给定的输入: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 %f\n", finalAverage);

}

4

3 回答 3

3

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

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

数字 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转换说明符将使用更多位数来表示较大的数字,因为它使用小数点后的固定位数,默认为六位。因此,例如 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 个十进制有效数字的浮点表示中打印到 9 个有效数字。您要求再提供两位不存在的精度,因此得到两位错误数字。

所以你可以做的是使用更广泛的类型double和/或改变你打印结果的方式。不要要求这么多有效数字。例如尝试%.3f(小数点后三位)。

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

于 2012-04-09T07:33:02.813 回答
0

使用双精度将解决您的问题。浮点数的准确性和精度是问题的根源。

于 2012-04-09T07:32:37.683 回答
0

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

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

我强烈建议您花时间阅读浮点数的工作原理(将其输入谷歌,您会找到大量解释!);了解它们在内部的表示方式将帮助您成为更好的程序员

于 2012-04-09T07:36:11.750 回答