在 C 语言中,如果想要对一个数进行取整,我们可以使用 <math.h> 标准库的 3 个函数来实现(如下表所示)。
| 函数 | 说明 |
|---|---|
| ceil() | 向上取整 |
| floor() | 向下取整 |
| round() | 四舍五入取整(C99 标准新增) |
此外,我们还可以使用 “类型转换” 来实现截断取整,比如使用 (int)3.6 会直接丢弃小数部分,然后返回 3。
ceil() 实现向上取整
在 C 语言中,我们可以使用 <math.h> 标准库的 ceil() 函数来对一个数进行向上取整。
语法:
ceil(x)说明:
ceil(x) 表示返回大于或等于 x 的最小整数。
注意: ceil() 函数的返回类型依然是 double,打印时需用 “%f”。
示例 1:
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("ceil(3.0) 等于:%f\n", ceil(3.0));
printf("ceil(0.4) 等于:%f\n", ceil(0.4));
printf("ceil(0.6) 等于:%f\n", ceil(0.6));
printf("ceil(-1.1) 等于:%f\n", ceil(-1.1));
printf("ceil(-1.9) 等于:%f", ceil(-1.9));
return 0;
}运行结果如下。
ceil(3.0) 等于:3.000000
ceil(0.4) 等于:1.000000
ceil(0.6) 等于:1.000000
ceil(-1.1) 等于:-1.000000
ceil(-1.9) 等于:-1.000000分析:
ceil() 函数表示对一个数进行向上取整。所谓 “向上取整”,指的是返回大于或等于指定数的 “最近的那个整数”。其中,ceil 就是 “天花板” 的意思,所以才叫 “向上取整”。
从这个例子可以看出,在 ceil(x) 中,那么 x 只有整数部分(小数部分为 0),那么就直接返回 x。如果 x 小数部分不为 0,那么就返回大于 x 最近的那个整数。其中,分析如下图所示。

floor() 实现向下取整
在 C 语言中,我们可以使用 <math.h> 标准库的 floor() 函数来对一个数进行向下取整。
语法:
floor(x)说明:
floor(x) 表示返回小于或等于 x 的最小整数。
示例 2:
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("floor(3.0) 等于:%f\n", floor(3.0));
printf("floor(0.4) 等于:%f\n", floor(0.4));
printf("floor(0.6) 等于:%f\n", floor(0.6));
printf("floor(-1.1) 等于:%f\n", floor(-1.1));
printf("floor(-1.9) 等于:%f", floor(-1.9));
return 0;
}运行结果如下。
floor(3.0) 等于:3.000000
floor(0.4) 等于:0.000000
floor(0.6) 等于:0.000000
floor(-1.1) 等于:-2.000000
floor(-1.9) 等于:-2.000000分析:
floor() 函数表示对一个数进行向下取整。所谓 “向下取整”,指的是返回小于或等于指定数的 “最近的那个整数”。其中,floor 就是 “地板” 的意思,所以才叫 “向下取整”。
从这个例子可以看出,在 floor(x) 中,那么 x 只有整数部分(小数部分为 0),那么就直接返回 x。如果 x 小数部分不为 0,那么就返回小于 x 最近的那个整数。其中,分析如下图所示。

round() 四舍五入取整
在 C99 标准中,我们可以使用 round() 函数用于将一个数四舍五入到最接近的整数。
语法:
round(x)说明:
round(x) 返回 x 四舍五入到最接近的整数的值。
对于正好是 0.5 的情况,round() 函数会远离 0 进行舍入。比如 round(2.5) 结果为 3,而 round(-2.5) 结果为 -3。
示例 3:
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("round(3.0) 等于:%f\n", round(3.0));
printf("round(0.4) 等于:%f\n", round(0.4));
printf("round(0.6) 等于:%f\n", round(0.6));
printf("round(2.5) 等于:%f\n", round(2.5));
printf("round(-1.1) 等于:%f\n", round(-1.1));
printf("round(-1.9) 等于:%f\n", round(-1.9));
printf("round(-2.5) 等于:%f\n", round(-2.5));
return 0;
}运行结果如下。
round(3.0) 等于:3.000000
round(0.4) 等于:0.000000
round(0.6) 等于:1.000000
round(2.5) 等于:3.000000
round(-1.1) 等于:-1.000000
round(-1.9) 等于:-2.000000
round(-2.5) 等于:-3.000000分析:
round() 函数实现了标准的四舍五入规则,当小数部分大于或等于 0.5 时会向上取整,而小于 0.5 时向下取整。对于 0.5 的情况,它会远离 0 取整。
使用 “类型转换” 截断取整
在 C 语言中,我们可以将浮点数类型强制转换为整数类型,这样会直接丢弃小数部分,从而实现向零取整(也称为截断取整)。
示例 4:
#include <stdio.h>
int main(void)
{
printf("(int)3.0 等于:%d\n", (int)3.0);
printf("(int)0.4 等于:%d\n", (int)0.4);
printf("(int)0.6 等于:%d\n", (int)0.6);
printf("(int)2.5 等于:%d\n", (int)2.5);
printf("(int)-1.1 等于:%d\n", (int)-1.1);
printf("(int)-1.9 等于:%d\n", (int)-1.9);
printf("(int)-2.5 等于:%d\n", (int)-2.5);
return 0;
}运行结果如下。
(int)3.0 等于:3
(int)0.4 等于:0
(int)0.6 等于:0
(int)2.5 等于:2
(int)-1.1 等于:-1
(int)-1.9 等于:-1
(int)-2.5 等于:-2分析:
通过将 float 或 double 类型的值强制转换为 int 类型,此时小数部分被直接舍弃,从而实现了向 0 方向的取整。
注意: 对于负数,floor() 和 (int) 强制转换的效果是不同的。floor() 是向负无穷取整(-1.9 -> -2.0),而 (int) 是向 0 取整(-1.9 -> -1)。
