我希望如果我将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作为结果。为什么呢?
答案 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);