【问题标题】:Difference in outputs while printing value stored in a variable and printing value directly using printf() [duplicate]打印存储在变量中的值和直接使用 printf() 打印值时输出的差异[重复]
【发布时间】:2016-11-06 19:44:06
【问题描述】:

我正在尝试编写一个简单的 C 程序,它以米为单位获取用户的输入,并以公里、码和英里为单位打印输出四舍五入到小数点后 4 位。

我用过这个1米=0.001公里=1.094码=0.0006215英里

当我写这个时,我得到了预期的输出:

#include <stdio.h>
int main()
{
   int m;
   float km, y, mi;
   scanf("%d",&m);
   km=(m*0.001);
   y=(m*1.094);
   mi=(m*0.0006215);
   printf("%.4f\n%.4f\n%.4f",km,y,mi);
   return 0;
}

输出:

0.1000

109.4000

0.0622

但是,当我写这个时,我得到了第三个输出错误:

#include <stdio.h>
int main()
{
   int m;
   scanf("%d",&m);
   printf("%.4f\n%.4f\n%.4f",(m*0.001),(m*1.094),(m*0.0006215));
   return 0;
}

输出:

0.1000

109.4000

0.0621

您能帮我找出造成这种差异的原因吗?


Edit-1

这里我输入了 100。

float y=100*0.0006215;
printf("%f",y);

输出 0.062150

还有这个

printf("%f",100*0.0006215);

也给出了输出 0.062150


Edit-2

float y=100*0.0006215;
printf("%.4f",y);

输出0.0622

同时:

printf("%.4f",100*0.0006215);

输出0.0621

而在 Edit-1 中都显示相同的输出。

【问题讨论】:

  • 我无法关联“浮点数学是否损坏?”我的问题。请查看编辑。

标签: c variables printf difference


【解决方案1】:

请注意0.001double 值。

在第一个示例中,您将double 结果分配给float,截断其重要性,然后在传递给printf 时将其提升为double

在第二个例子中,没有floatdouble的结果直接传递给printf

另外,请参阅Is floating point math broken?

【讨论】:

  • 这里我输入了 100:float y=100*0.0006215; printf("%f",y);给出输出 0.062150 和这个 printf("%f",100*0.0006215);也给出了输出 0.062150 那么为什么在这两种情况下使用“%.4f”给出了不同的答案?我看到你提到第二个例子中没有浮点数,但我看到输出包含 6 个小数位,表示浮点数而不是双精度数。我哪里做错了?
  • 请查看相关编辑以更好地理解我的问题
  • 因为数字不同,四舍五入也不同。
  • 对不起,我还是没听懂。请参阅编辑 2。我希望这能够更好地向您解释我的问题。
  • 如果你打印小数点后 9 位,你会得到 0.0621500020.062150000 所以我猜库代码是向下舍入 5 或更少,并且向上舍入大于 5,因为当您要求小数点后 4 位时,5xxxx 要四舍五入。请记住,对于浮点分数,您通常只会得到数字的近似值,而不是精确 数字。这就是“断开”链接的相关性。
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2021-12-06
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多