C 取整

在 C 语言中,如果想要对一个数进行取整,我们可以使用 <math.h> 标准库的 3 个函数来实现(如下表所示)。

C 取整函数
函数 说明
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 最近的那个整数。其中,分析如下图所示。

C 实现向上取整

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 最近的那个整数。其中,分析如下图所示。

C 实现向下取整

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)。

上一篇: C 延时函数

下一篇: C 绝对值

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号