ceilf
2026/4/14大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — ceilf
ceilf
定义
ceilf() 是一个将浮点数向上取整的数学函数。所谓"向上取整",就是不管小数部分是多少,哪怕只有一丁点儿,都往正方向(更大的方向)进一位,取最近的整数。
打个比方:就像超市结账时,不管你买了 3.1 斤还是 3.9 斤水果,包装袋都按 4 斤来算。只要你超出了 3 斤的整数,就一律算作 4 斤。
为什么需要向上取整?
在游戏开发中,有很多场景需要"宁多勿少"的计算。例如:
- 计算需要的物品数量:如果一个角色升级需要 3.2 个技能点,你不能给他 3 个(不够),必须给他 4 个。
- 计算 UI 网格行数:如果有 15 个道具,每行最多放 4 个,你需要
ceilf(15 / 4.0) = 4行才能放得下。 - 计算所需时间:如果一个任务需要 2.1 秒完成,你可能需要安排 3 秒的时间窗口。
函数签名
C#
// Mathf.Ceil 返回 float 类型
public static float Ceil(float x)GDScript
func ceilf(x: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| x | float | 是 | 需要向上取整的浮点数(输入值) |
返回值
类型: float
返回将 x 向正无穷方向取整后的结果,是一个浮点数形式的整数值(比如返回 4.0 而不是 4)。
具体行为:
| 输入值 | 返回值 | 说明 |
|---|---|---|
3.1 | 4.0 | 小数部分不为零,向上进一位 |
3.9 | 4.0 | 小数部分不为零,向上进一位 |
3.0 | 3.0 | 已经是整数,原样返回 |
-2.1 | -2.0 | 负数向上取整,向正方向靠近(-2 比 -2.1 大) |
-2.0 | -2.0 | 已经是整数,原样返回 |
代码示例
基本用法
C#
using Godot;
public partial class CeilfExample : Node
{
public override void _Ready()
{
// 基本向上取整
GD.Print(Mathf.Ceil(3.1f)); // 输出: 4
GD.Print(Mathf.Ceil(3.9f)); // 输出: 4
GD.Print(Mathf.Ceil(3.0f)); // 输出: 3
// 负数的情况
GD.Print(Mathf.Ceil(-2.1f)); // 输出: -2
}
}GDScript
func _ready():
# 基本向上取整
print(ceilf(3.1)) # 输出: 4.0
print(ceilf(3.9)) # 输出: 4.0
print(ceilf(3.0)) # 输出: 3.0
# 负数的情况
print(ceilf(-2.1)) # 输出: -2.0实际场景:计算 UI 网格需要多少行
C#
using Godot;
public partial class InventoryGrid : Node
{
// 每行最多显示的物品数
[Export] public int ExItemsPerRow = 4;
// 计算总共需要多少行
private int CalculateRowCount(int totalItems)
{
// 比如有 15 个物品,每行 4 个,需要 ceilf(15/4) = 4 行
float rows = Mathf.Ceil((float)totalItems / ExItemsPerRow);
return (int)rows;
}
public override void _Ready()
{
int totalItems = 15;
int rows = CalculateRowCount(totalItems);
GD.Print($"共 {totalItems} 个物品,每行 {ExItemsPerRow} 个,需要 {rows} 行");
// 输出: 共 15 个物品,每行 4 个,需要 4 行
}
}GDScript
extends Node
# 每行最多显示的物品数
@export var ex_items_per_row: int = 4
# 计算总共需要多少行
func calculate_row_count(total_items: int) -> int:
# 比如有 15 个物品,每行 4 个,需要 ceilf(15/4) = 4 行
var rows := ceilf(float(total_items) / ex_items_per_row)
return int(rows)
func _ready():
var total_items := 15
var rows := calculate_row_count(total_items)
print("共 %d 个物品,每行 %d 个,需要 %d 行" % [total_items, ex_items_per_row, rows])
# 输出: 共 15 个物品,每行 4 个,需要 4 行注意事项
返回值是 float,不是 int:
ceilf()返回的是一个浮点数(比如4.0),如果你需要整数,需要额外进行类型转换。在 C# 中用(int)Mathf.Ceil(x)或Mathf.CeilToInt(x),在 GDScript 中用int(ceilf(x))。与
ceili()的区别:ceilf()返回 float 类型,而ceili()直接返回 int 类型。如果你确定需要一个整数结果,用ceili()更方便。与
floorf()相反:floorf()是向下取整(地板函数),ceilf()是向上取整(天花板函数)。你可以把ceil想象成"天花板"——总是往高处走。负数的行为可能出乎意料:
ceilf(-2.1)返回-2.0而不是-3.0,因为"向上"指的是数学上向正无穷方向,而不是向远离零的方向。如果你需要"远离零"的取整,需要自己判断正负号再做处理。
