CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

Lua+取整方向:math.floor和ceil的选择本质

2026-09-29 16:16 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

取整方向的选择就这两行:

lua
math.floor(3.7)  -- 3
math.ceil(3.2)   -- 4

floor 向下取整,ceil 向上取整——两者的分界线就是小数部分是否大于零——取整方向的选择决定了游戏数值的精度和公平性。今天拆开。

一、floor、ceil、fmod 三段

取整的三段。floor:math.floor(3.7) 向下取整返回 3——math.floor(-3.7) 向下取整返回 -4——floor 对负数是"更远离零",对正数是"更接近零"——floor 的语义是"不大于 x 的最大整数"。ceil:math.ceil(3.2) 向上取整返回 4——math.ceil(-3.2) 向上取整返回 -3——ceil 对负数是"更接近零",对正数是"更远离零"——ceil 的语义是"不小于 x 的最小整数"。fmod:math.fmod(7, 3) 返回 1——fmod 的符号和被除数一致——math.fmod(-7, 3) 返回 -1——fmod 不是取模,是取余——两者的区别在负数的处理上。三段连起来:取整家族玩的是"连续到离散的映射"——floor 是地板、ceil 是天花板、fmod 是余数——三个方向各有各的用途。

mermaid
graph TD
    A["x = 3.7"] --> B["floor(3.7) = 3"]
    A --> C["ceil(3.7) = 4"]
    A --> D["round(3.7) = 4"]
    A --> E["x = -3.7"]
    E --> F["floor(-3.7) = -4"]
    E --> G["ceil(-3.7) = -3"]
    E --> H["round(-3.7) = -4"]

二、取整的正确写法

lua
-- 伤害取整: 向下
local dmg = math.floor(rawDmg)

-- 回合数计算: 向上
local turns = math.ceil(totalHp / dpsPerTurn)

-- 四舍五入: Lua没有round, 手动实现
local function round(x)
    return math.floor(x + 0.5)
end

-- 负数的四舍五入: -3.5 → -4
local function roundNeg(x)
    return math.floor(x + 0.5)
end
-- 注意: round(-3.5) = math.floor(-3.0) = -3
-- round(-3.5) 应该是 -4, 所以要修正
local function roundHalf(x)
    return math.floor(x + 0.5)
end
-- roundHalf(-3.5) = floor(-3.0) = -3, 不是-4
-- 修正: math.floor(x + 0.5) 对负数向下偏了
local function roundHalfNeg(x)
    if x >= 0 then return math.floor(x + 0.5) end
    return math.ceil(x - 0.5)
end

roundHalfNeg 对负数的修正展示了取整方向的复杂性——正数和负数的取整方向不同,四舍五入的实现不能一刀切。

三、floor 和 ceil 的分界与零的归宿

floor 和 ceil 的分界线在零:floor(0.5) = 0 且 ceil(0.5) = 1——0.5 恰好在两者中间——floor 归零、ceil 归一——这个分界点在游戏数值里就是"是否触发"的临界值。和 round 的分账写清楚:floor 是"向下取整"、ceil 是"向上取整"、round 是"最近取整"——round 可以用 floor 和 ceil 组合实现——但 round 对 .5 的处理有歧义:3.5 → 4 还是 3?银行家舍入法说"偶数优先"——Lua 没有 round,自己实现的 round 要明确 .5 的方向。最后一条纪律:伤害计算用 floor——伤害必须是整数且不能虚高——floor 保证"说好的伤害一分不多"——ceil 用于回合数——回合必须覆盖全部血量,ceil 保证"覆盖完整不多不少"。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

绝境回纹:血越少纹越亮,一口气回到满

【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

蚀蓝纹咒:抽干它的法力,咒念憋在喉咙里

【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

双纹换形:红纹饮刀蓝纹披甲,一念换身

【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

免死金纹:纹碎金光,刀下留人一线

【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

夺纹掠势:剥了它的怒,披在我身上

【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…

2026-10-01 20:32 996 技术组
进阶实战游戏功能

反纹镜咒:纹光一闪,它的火原路奉还

【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…

2026-10-01 20:32 996 技术组