ceil 是 "ceiling"(天花板)的缩写,它的作用是“向上取整”,也就是说,它返回一个大于或等于给定数字的最小整数。

(图片来源网络,侵删)
函数原型
ceil 函数在 C 语言中是标准数学库的一部分,其函数原型如下:
#include <math.h> double ceil(double x);
- 头文件: 使用
ceil函数之前,必须包含<math.h>头文件。 - 参数:
x是一个double类型的浮点数。 - 返回值: 返回一个
double类型的值,该值是大于或等于x的最小整数,这个整数被表示为double类型。
功能详解
ceil 的核心思想是“向正无穷大的方向取整”。
输入 x |
ceil(x) 的结果 |
解释 |
|---|---|---|
3 |
0 |
大于 2.3 的最小整数是 3。 |
0 |
0 |
0 本身就是整数,所以结果还是 2.0。 |
-1.7 |
-1.0 |
大于 -1.7 的最小整数是 -1 (因为 -1 > -1.7 > -2)。 |
-2.0 |
-2.0 |
-2.0 本身就是整数,结果不变。 |
0 |
0 |
零的整数部分是零。 |
如何使用
使用 ceil 函数需要三个步骤:
- 包含头文件:
#include <math.h> - 链接数学库: 在编译时,需要链接 C 的数学库,在 Linux 或 macOS 上使用
-lm选项,在 Windows (Visual Studio) 上通常不需要。- 编译命令示例:
gcc your_program.c -o your_program -lm
- 编译命令示例:
- 调用函数: 在代码中调用
ceil()。
代码示例
下面是一个完整的 C 语言示例,演示了 ceil 函数的用法。

(图片来源网络,侵删)
#include <stdio.h>
#include <math.h> // 1. 包含 math.h 头文件
int main() {
double num1 = 2.3;
double num2 = -1.7;
double num3 = 5.0;
double num4 = 0.0;
// 2. 调用 ceil 函数
double result1 = ceil(num1);
double result2 = ceil(num2);
double result3 = ceil(num3);
double result4 = ceil(num4);
// 3. 打印结果
printf("ceil(%.2f) = %.1f\n", num1, result1); // 输出: ceil(2.30) = 3.0
printf("ceil(%.2f) = %.1f\n", num2, result2); // 输出: ceil(-1.70) = -1.0
printf("ceil(%.2f) = %.1f\n", num3, result3); // 输出: ceil(5.00) = 5.0
printf("ceil(%.2f) = %.1f\n", num4, result4); // 输出: ceil(0.00) = 0.0
return 0;
}
编译和运行 (Linux/macOS):
gcc ceil_example.c -o ceil_example -lm ./ceil_example
相关函数:floor 和 round
为了更好地理解 ceil,通常会将它与 floor 和 round 函数进行比较。
| 函数 | 功能 | 示例 (x = 3.7) |
示例 (x = -3.7) |
|---|---|---|---|
ceil(x) |
向上取整 (天花板) | 0 |
-3.0 |
floor(x) |
向下取整 (地板) | 0 |
-4.0 |
round(x) |
四舍五入到最接近的整数 | 0 |
-4.0 |
代码示例对比:
#include <stdio.h>
#include <math.h>
int main() {
double x = 3.7;
double y = -3.7;
printf("对于 x = %.1f:\n", x);
printf(" ceil(%.1f) = %.1f\n", x, ceil(x));
printf(" floor(%.1f) = %.1f\n", x, floor(x));
printf(" round(%.1f) = %.1f\n", x, round(x));
printf("\n对于 y = %.1f:\n", y);
printf(" ceil(%.1f) = %.1f\n", y, ceil(y));
printf(" floor(%.1f) = %.1f\n", y, floor(y));
printf(" round(%.1f) = %.1f\n", y, round(y));
return 0;
}
输出结果:

(图片来源网络,侵删)
对于 x = 3.7:
ceil(3.7) = 4.0
floor(3.7) = 3.0
round(3.7) = 4.0
对于 y = -3.7:
ceil(-3.7) = -3.0
floor(-3.7) = -4.0
round(-3.7) = -4.0
常见问题与注意事项
Q1: 为什么编译时要加 -lm?
A1: 因为 ceil、floor、sin、cos 等数学函数不属于 C 语言的核心库(stdio.h 或 stdlib.h),它们位于一个单独的数学库中。-lm 选项告诉链接器去链接这个数学库,如果你忘记加,编译器会提示 "undefined reference to `ceil'" 之类的错误。
Q2: ceil 返回的是 double 类型,我想要一个 int 类型怎么办?
A2: 你需要进行类型转换,直接强制转换 (int)ceil(x) 是不安全的,因为对于非常大的 double 值,它可能会超出 int 的表示范围。
更安全的方法是先检查 x 的值是否在 int 的范围内,然后再进行转换。
#include <stdio.h>
#include <math.h>
#include <limits.h> // 用于 INT_MAX 和 INT_MIN
int main() {
double x = 123456789.12;
double y = 12345678901234.56; // 超出了 int 的范围
// 安全的转换方式
if (x >= INT_MIN && x <= INT_MAX) {
int result = (int)ceil(x);
printf("ceil(%.2f) 的整数表示是: %d\n", x, result);
} else {
printf("错误: %.2f 超出了 int 类型的范围\n", x);
}
if (y >= INT_MIN && y <= INT_MAX) {
int result = (int)ceil(y);
printf("ceil(%.2f) 的整数表示是: %d\n", y, result);
} else {
printf("错误: %.2f 超出了 int 类型的范围\n", y);
}
return 0;
}
Q3: ceil 和 round 有什么区别?
A3: 这是初学者最容易混淆的地方。
ceil: 只关心“向上”。ceil(3.1)是0,ceil(3.9)也是0。round: 寻找“最接近”的整数。round(3.1)是0(因为 3 比 4 更接近 3.1),而round(3.5)是0(遵循“四舍五入”规则,.5 会向上舍入)。
| 特性 | 描述 |
|---|---|
| 函数名 | ceil |
| 头文件 | <math.h> |
| 功能 | 向上取整,返回大于或等于给定值的最小整数。 |
| 返回类型 | double |
| 编译选项 | 需要 -lm (在 Linux/macOS 下) |
| 关键点 | 对于正数,结果比原数大;对于负数,结果比原数大(更接近零)。 |
