floor
2026/4/14大约 4 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — floor
floor
定义
floor() 是一个向下取整的数学函数。所谓"向下取整",就是无论小数部分是多少,都只取不超过这个数的最大整数——简单说就是"往地板(floor)方向靠"。
打个比方:想象你坐电梯,不管你在 3.1 楼还是 3.9 楼,电梯只会往下走到 3 楼,绝对不会往上走。floor 这个名字就来自"地板"——永远只往低处走。
再比如:你跑了 5.7 公里,但跑步 app 只记录完整的公里数,所以显示你跑了 5 公里。floor(5.7) 返回 5.0,就是这个意思。
函数签名
C#
// Mathf.Floor 返回 float 类型
public static float Floor(float s)GDScript
func floor(x: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
| x / s | float | 是 | 需要向下取整的浮点数值 |
返回值
类型: float
返回小于或等于 x 的最大整数,但类型仍然是浮点数(比如 3.0 而不是 3)。
| 输入值 | 返回值 | 说明 |
|---|---|---|
3.1 | 3.0 | 砍掉小数部分,向下取 |
3.9 | 3.0 | 砍掉小数部分,向下取 |
3.0 | 3.0 | 已经是整数,原样返回 |
-2.1 | -3.0 | 负数向下取整,向更小的方向靠近(-3 < -2.1) |
-2.0 | -2.0 | 已经是整数,原样返回 |
代码示例
基础用法
C#
using Godot;
public partial class FloorExample : Node
{
public override void _Ready()
{
// 正数向下取整
GD.Print(Mathf.Floor(3.1f)); // 运行结果: 3
GD.Print(Mathf.Floor(3.9f)); // 运行结果: 3
GD.Print(Mathf.Floor(3.0f)); // 运行结果: 3
// 负数向下取整(注意方向)
GD.Print(Mathf.Floor(-2.1f)); // 运行结果: -3
GD.Print(Mathf.Floor(-2.9f)); // 运行结果: -3
}
}GDScript
func _ready():
# 正数向下取整
print(floor(3.1)) # 运行结果: 3.0
print(floor(3.9)) # 运行结果: 3.0
print(floor(3.0)) # 运行结果: 3.0
# 负数向下取整(注意方向)
print(floor(-2.1)) # 运行结果: -3.0
print(floor(-2.9)) # 运行结果: -3.0实际场景:计算经验值对应的等级
C#
using Godot;
public partial class LevelSystem : Node
{
// 每级需要的经验值
[Export] public int ExpPerLevel = 1000;
// 根据总经验值计算当前等级
private int CalculateLevel(int totalExp)
{
return (int)Mathf.Floor((float)totalExp / ExpPerLevel);
}
public override void _Ready()
{
int totalExp = 2450;
int level = CalculateLevel(totalExp);
GD.Print($"总经验: {totalExp}, 当前等级: {level}");
// 运行结果: 总经验: 2450, 当前等级: 2
int exp2 = 999;
int level2 = CalculateLevel(exp2);
GD.Print($"总经验: {exp2}, 当前等级: {level2}");
// 运行结果: 总经验: 999, 当前等级: 0
}
}GDScript
extends Node
# 每级需要的经验值
@export var ex_exp_per_level: int = 1000
# 根据总经验值计算当前等级
func calculate_level(total_exp: int) -> int:
return int(floor(float(total_exp) / ex_exp_per_level))
func _ready():
var total_exp := 2450
var level := calculate_level(total_exp)
print("总经验: %d, 当前等级: %d" % [total_exp, level])
# 运行结果: 总经验: 2450, 当前等级: 2
var exp2 := 999
var level2 := calculate_level(exp2)
print("总经验: %d, 当前等级: %d" % [exp2, level2])
# 运行结果: 总经验: 999, 当前等级: 0进阶用法:2D 像素坐标对齐
C#
using Godot;
public partial class PixelAlign : Node2D
{
// 将浮点坐标对齐到整数像素,避免"半像素"导致的画面模糊
private Vector2 SnapToPixel(Vector2 position)
{
return new Vector2(
Mathf.Floor(position.X),
Mathf.Floor(position.Y)
);
}
public override void _Ready()
{
Vector2 rawPos = new Vector2(10.7f, 20.3f);
Vector2 snapped = SnapToPixel(rawPos);
GD.Print($"原始坐标: {rawPos}, 像素对齐后: {snapped}");
// 运行结果: 原始坐标: (10.7, 20.3), 像素对齐后: (10, 20)
// 将连续坐标转为网格索引
float worldX = 47.8f;
int gridSize = 16;
int cellIndex = (int)Mathf.Floor(worldX / gridSize);
GD.Print($"世界坐标: {worldX}, 网格大小: {gridSize}, 所在格子: {cellIndex}");
// 运行结果: 世界坐标: 47.8, 网格大小: 16, 所在格子: 2
}
}GDScript
extends Node2D
# 将浮点坐标对齐到整数像素,避免"半像素"导致的画面模糊
func snap_to_pixel(position: Vector2) -> Vector2:
return Vector2(
floor(position.x),
floor(position.y)
)
func _ready():
var raw_pos := Vector2(10.7, 20.3)
var snapped := snap_to_pixel(raw_pos)
print("原始坐标: %s, 像素对齐后: %s" % [raw_pos, snapped])
# 运行结果: 原始坐标: (10.7, 20.3), 像素对齐后: (10, 20)
# 将连续坐标转为网格索引
var world_x := 47.8
var grid_size := 16
var cell_index := int(floor(world_x / grid_size))
print("世界坐标: %s, 网格大小: %d, 所在格子: %d" % [world_x, grid_size, cell_index])
# 运行结果: 世界坐标: 47.8, 网格大小: 16, 所在格子: 2注意事项
返回值是 float,不是 int:
floor()返回浮点数(如3.0),如果你需要整数类型,在 C# 中用(int)Mathf.Floor(x)或Mathf.FloorToInt(x);在 GDScript 中用int(floor(x))。负数的行为可能出乎意料:
floor(-2.1)返回-3.0而不是-2.0,因为"向下"指的是数学上向负无穷方向(即数值更小的方向)。如果你只是想简单砍掉小数部分(向零取整),直接用int(x)即可,此时-2.1会变成-2。与
ceil()相反:floor()是地板函数(向下取整),ceil()是天花板函数(向上取整)。与
round()的区别:floor()无条件向下,而round()是四舍五入——会根据小数部分的大小选择最近的整数。
