浮点输出不一致

时间:2016-03-02 06:24:00

标签: c floating-point

我想更好地理解浮点值和相关的不精确性。

以下是两个略有修改的片段

Snippet 1

#include <stdio.h>

int main(void)
{
   float a = 12.59;
   printf("%.100f\n", a);
}

输出:

12.5900001525878906250000000000000000000000000000000000000000000000000000000000000000000000000000000000

代码段2:

#include <stdio.h>

int main(void)
{
   printf("%.100f\n", 12.59);
}

输出:

12.589999999999999857891452847979962825775146484375000000000000000000000000000000000000000000000000000

为什么两个输出都有差异?我无法理解这个问题。

3 个答案:

答案 0 :(得分:2)

在第一种情况下,您将变量定义为浮点数,在第二种情况下,您直接给出了数字。

系统可能会将直接数视为double而不是float。

所以,我认为可能是因为float和double的系统定义。

答案 1 :(得分:2)

获取可以显式使用浮点文字的一致行为:

printf("%.100f\n", 12.59f);

答案 2 :(得分:1)

在Snippet 1中,你的float会被转换为double,而这个转换会导致值发生变化(由于浮点表示的复杂性)。

在Snippet 2中,这个演员阵容并没有发生,而是直接打印成双人。

要理解,请尝试运行以下代码段:

#include <stdio.h>

int main(void) {
    double a = 12.59;
    printf("%.100f\n", a);  
    return 0;
}

int main(void) {
    float a = 12.59;
    printf("%.100f\n", (double)a);  
    return 0;
}

有关详细信息,请参阅此处:How does printf and co differentiate beetween float and double