【语法算法】
取整方向的选择就这两行:
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 是余数——三个方向各有各的用途。
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"]
二、取整的正确写法
-- 伤害取整: 向下
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 再抛一个老问题:奶量是固定好还是浮动好?固定回五十的术式,满血喝是五十、残血喝也是五十,账目清楚,可总差点意思…
【游戏功能】 前阵子一场"永动机事故"在群里传了半天:某个会喷火的精英怪被玩家围了一整晚,火喷了八个钟头没停——后台一看,它…
【游戏功能】 mode=mode==='red'?'blue':'red' ——先拆这一行。一个变量存着当前纹色,三元运算符…
【游戏功能】 上一版埋了个查了半宿的隐蔽报错:测试组报"玩家血条归零了人还站着",后台的死亡日志一条没有,复活接口也没被调过…
【游戏功能】 先抛一个坑:增益为什么只能自己挂?怒气、护体、神行,攻略里全在教你"什么时候开自己的招",可怪身上明晃晃挂着的…
【游戏功能】 昨天夜里一场线上事故把"反纹"顶上了台面:一个玩家把反纹挂在自己身上站桩挂机,怪的火球过来他没倒,反倒躺下的是…