取余运算 % 与 math.fmod 看似同物,负数输入时结果不同:Lua 的 % 结果符号跟随除数(结果补到非负),math.fmod 结果符号跟随被除数(保持负号)。学员用 % 做环状索引后传入负数,索引越界报错却找不到原因。错误场景:
print(-7 % 3)
print(math.fmod(-7, 3))
% 输出 2(补到非负),fmod 输出 -1(保持符号)——两个"余数"差了整整一个除数。
需要非负的环状回绕用 %(配合 +1 转下标),需要带符号的数学余数用 fmod。规范写法。示例代码如下:
local function ringIndex(i, n)
return i % n + 1
end
print(ringIndex(-1, 5))
print(ringIndex(7, 5))
ringIndex(-1, 5) 得 5(负一正确回绕到末位),ringIndex(7, 5) 得 3(超出回绕)——环状索引对任意整数输入都安全。
三步验证:-7 % 3 得 2;math.fmod(-7, 3) 得 -1;正数输入时两者一致(7 % 3 与 fmod(7, 3) 都是 1)——差异只在负数出现,正数场景可互换。
math.fmod 对浮点数同样适用,配合 floor 可截取小数的指定位。示例代码如下:
print(math.fmod(7.5, 2))
print(math.floor(7.5 * 10) % 10)
fmod(7.5, 2) 得 1.5,floor 乘十取余得 5(小数点后首位数字)——浮点余数与位截取的组合常见于坐标与进度条计算。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:if CONTRIB = price then CONTRIB = CONTRIB - pric…
【语法】 一、隐蔽陷阱:三个物品的全排列共 6 种,手写三重循环出 27 种含大量重复——递归交换法:固定一位、递归排其余、…
【语法】 一、抛坑提问:成就池 50 项,玩家已解锁 32 项,剩下的怎么一遍筛出?差集运算——以全集为基准,遍历时查已有集…
【语法】 一、抛坑提问:3 根柱子 5 个盘子从甲柱挪到丙柱,每次只能移一个且大盘不压小盘——把"挪 n 个"分解成"挪 n…
【游戏】 一、一行代码拆解:CASTING[actor] = nil —— 回城打断的核心:施法期间被攻击即清空施法状态并返…
【游戏】 一、一行代码拆解:APPLY[acc] = os.time() —— 入会审批的全部骨架:申请进队列带时间戳,官员…