3

我想做以下事情:

我使用一个变量int a来保留来自控制台的输入,然后我执行以下操作:

int b = a / 16;

什么时候a是 64 或 32,我得到 4 或 2。但如果a是 63,我希望得到 4,但我得到 3。C 中有什么方法可以得到四舍五入的值?

编辑. 更多细节:

rang 1 to 16 should get 1,
rang 17 to 32 should get 2,
rang 33 to 48 should get 3,
rang 49 to 64 should get 4
4

7 回答 7

4

当您使用/带有两个int参数的除法运算符时,它将返回一个int表示截断结果的值。

您可以在不使用浮点数的情况下获得四舍五入的除法,如下所示:

int a;
int den = 16;
int b = (a + den - 1) / den;

这会给你你所期望的:

a ∈      [0], b =        0 / 16 = 0,
a ∈  [1, 16], b = [16, 31] / 16 = 1,
a ∈ [17, 32], b = [32, 47] / 16 = 2,
a ∈ [33, 48], b = [48, 63] / 16 = 3,
a ∈ [49, 64], b = [64, 79] / 16 = 4,
...

请注意,这仅在ab是肯定的情况下才有效,并注意a + den. 如果a + den怀疑可能溢出,则可以使用此表达式的另一个版本:

int b = (a - 1) / den + 1;

唯一的缺点是它会1a = 0. 如果这是一个问题,您可以添加如下内容:

int b = (a - 1) / den + 1 - !a;

请注意,您还可以以相同的方式处理负值a(从零舍入):

int b = (a > 0) ? (a - 1) / den + 1 : (a - den + 1) / den;
于 2013-06-03T09:28:23.633 回答
2

C 中的整数除法/不做rouding,而是做truncation

于 2013-06-03T08:56:05.597 回答
1

解决方案

int ans, newNo;
int no = 63; // Given number
int dNo = 16; // Divider

newNo = (no % dNo) ? (dNo - (no % dNo) + no) : no; // Round off number

ans = newNo / dNo;

编辑

优化解决方案

ans = (no / dNo) + !!(no % dNo);

于 2013-06-03T09:34:37.563 回答
0

您可以尝试使用以下

 int b = (int)ceil((double)a/16);
于 2013-06-03T09:23:55.660 回答
0

无论您尝试什么在概念上都不正确,但如果您想要与您在问题中所说的相同的结果,您可以尝试double ceil(double x)在 math.h 中定义的标准函数

向上舍入 x,返回不小于 x 的最小整数值。

于 2013-06-03T09:25:16.840 回答
0

获得所需内容的最简单方法是使用浮点数。

#include <math.h>
#include <stdio.h>

int main(void) 
{
  double a = 63.0;
  double b = 16.0;

  printf("%d", (int) round(a / b));

  return 0;
}

从浮点数转换为整数时要小心,反之亦然。例如,round(63/16)不正确。它返回一个双精度值,但什么也没做,因为文字 63 和 16 是整数。除法是在将值传递给函数之前完成的。正确的方法是确保一个或两个操作数都是 double 类型:round(63.0 / 16.0)

于 2013-06-03T09:26:45.547 回答
0

由于 C int 除法总是向零舍入,因此可以用来使其均匀舍入的一个简单技巧是在舍入发生之前将“0.5”添加到数字。例如,如果要除以 32,请使用

x = (a+16)/32;

或更一般地,对于 a/b,其中 a 和 b 都是正数:

x = (a+b/2)/b;

不幸的是,负数使它有点复杂,因为如果结果是负数,那么你需要减去 0.5 而不是添加它。如果您在编写代码时已经知道它是正面的还是负面的,那没问题,但是如果您同时处理正面和负面的答案,它就会变得混乱。你可以这样做...

x = (a+((a/b>0)?1:-1)*(b/2)) / b;

但到了那个阶段,它开始变得非常复杂 - 最好只转换为浮动并使用该round函数。

--

[编辑] 正如 zakinster 指出的那样,尽管问题要求使用“圆形”值,但给出的示例实际上需要ceil. 用整数做到这一点的方法是:

x = (a+b-1)/b;

同样,如果答案可能是否定的,这将变得复杂:

x = (a+((a/b>0)?1:-1)*(b-1)) / b;

万一有人感兴趣,我会留下我原来的回答,甚至四舍五入。

于 2013-06-03T11:10:30.900 回答