scanf float,print float,不同值?

时间:2011-12-14 21:04:13

标签: double floating-accuracy

#include "stdafx.h"
#include "stdio.h"
#include "math.h"

int main()
{
float c;

printf("Type c");

scanf("%f", &c);


    printf("C is c: %f ",c);

    while(getchar()!='\n');
    getchar();
    return 0;

    }

非常简单的代码,我刚开始用C. 大多数数字工作正常,但例如,如果我输入47.2然后它打印我47.200001与88.4321输出88.432098 但与其他数字如5.4工作正常5.400000 我使用的是Microsoft Visual Studio 10.

另一件事如果上面的代码而不是把浮动c我放双,我不能printf我应该把什么代替%f? 但它让我更担心我的第一个问题,也许这与编译器有关,也许我正在编译c代码作为c ++,我不知道。

1 个答案:

答案 0 :(得分:0)

关于您的数字准确性。当以二进制格式存储浮点值时,这是一个已知问题。从PHP文档略微修改......

浮点数的精度有限。虽然它取决于系统,但大多数语言通常使用IEEE 754双精度格式,由于1.11e-16的舍入,这将产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑错误编程。

此外,基本10中的浮点数精确表示的有理数,如0.1或0.7,没有精确表示为基数2中的浮点数,无论尾数的大小如何,它都在内部使用。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....

因此,永远不要将浮点数结果信任到最后一位数,并且永远不要将浮点数与相等性进行比较。

如果您需要更高的精确度,您可能需要调查补充库,其唯一目的是处理高精度数字。