【问题标题】:Rounding Error in Integer Assignment整数赋值中的舍入误差
【发布时间】:2012-04-26 07:14:38
【问题描述】:

你如何解释这里发生的舍入?我认为将浮点值分配给 Int 总是会导致小数点后的值丢失?

int z=39.99999999999999999999999;
printf("%d",z); // gives 40

谢谢

【问题讨论】:

标签: c floating-point printf rounding scanf


【解决方案1】:

你不可能有足够精确的双精度来容纳所有这些 9。

>>> '%.15f' % 39.9999999999999
'39.999999999999901'
>>> '%.15f' % 39.99999999999999
'39.999999999999993'
>>> '%.15f' % 39.999999999999999
'40.000000000000000'

【讨论】:

  • 你能解释一下你写了什么吗?
  • 基本上,浮点数不能准确地表示你用十进制写的数字。你得到它的最佳估计。在这种情况下,他证明了将第 15 个 9 相加可以将最佳估计推到 40,因此当您将其截断为整数时,您会得到 40。
【解决方案2】:

正如您所说:C 的浮点到整数转换会截断(丢弃)小数部分。

您使用的是哪个编译器?我相信这个赋值不是在运行时完成的,它可能是一个编译器问题。

参考:comp.lang.c FAQ list

【讨论】:

  • 浮点数被四舍五入。请参阅 Ignacio Vazquez-Abrams 的回答。
  • 感谢您的洞察力。请您提供一个解释的链接吗?我只能找到像我链接的解释。即[链接]stackoverflow.com/questions/9694325/…
  • 有一篇有趣的文章简要解释了浮点数:cprogramming.com/tutorial/floating_point/…
  • 谢谢。我可以谦虚地请你试试这个,好吗? 'int a = 2.6; printf("%d\n",a);'
  • 因为如果它打印 2 这意味着 2.6 没有被四舍五入,它被截断了。还是我在这里遗漏了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多