为什么我的简单舍入技巧不起作用?

时间:2014-07-28 16:02:51

标签: c rounding

我希望如果我将0.5添加到double,然后截断该值以将double舍入到最接近的整数。但是,在以下代码中它不起作用:

#include<stdio.h>
int main()
{
  int a,b,d;
  double c;
  a = 54325;
  b = 7858;

  c = a/b;
  c = c+0.5;           /* rounding trick */

  d = (int)c;          /* truncate integer */
  printf("%d\n",d);
  return 0;
} 
<54> 54325/7858应该会产生6.91,所以如果我添加0.5然后截断该值,我的答案应该是7.但是,我得到6作为结果。为什么呢?

4 个答案:

答案 0 :(得分:4)

 c=a/b;

是整数除法,因为/的两个操作数都是整数类型。即使此处c属于double类型,也是如此。

要进行浮点除法,您需要/运算符的一个操作数为浮点类型:

 c = (double) a / b;

答案 1 :(得分:1)

这是因为这个表达式

c=a/b;

产生一个整数结果:将它分配给double并不重要 - 两个int的除法始终为int

通过添加演员来修复它:

c=(double)a/b;

答案 2 :(得分:1)

“54325/7858应该会产生6.91”

不,它没有。

整数 54,325 除以整数 7,858 ,结果为整数 6

没有.91,因为int / int = int

答案 3 :(得分:0)

因为54325/7858整数除法。没有涉及四舍五入 一点都不它只是告诉你有多少次可以将divisor(7858拟合分配到divider中 (54325)。整数除法也与整数余数耦合,因此:

div = a / b;
rem = a % b;

然后这就成了:

div * b + rem == a
如果涉及任何类型的舍入,它永远不会成立。

如果您想要舍入,请至少将一个值投射到double(或float),然后使用其中一个:

#include <math.h>
...
double c = (double)a / b;
double rounded_to_nearest = round(c);
double rounded_up         = ceil(c);
double rounded_down       = floor(c);