一、一行代码拆解:math.abs(a - b) < 1e-6 —— 浮点数不能直接比相等:二进制表示有尾差,判等要用"差的绝对值小于容差"这一行。
二、底层原理:0.1 与 0.2 的二进制都是无限循环,相加得 0.30000000000000004,直接与 0.3 比较恒为 false;容差把"数学相等"翻译成"足够接近"。
三、正确代码:
错误写法。示例代码如下:
local total = 0.1 + 0.2
if total == 0.3 then
sendmsg(actor, 1, "结算通过") -- 永远走不到,尾差作祟
end
正确写法。示例代码如下:
local function near(a, b)
return math.abs(a - b) < 1e-6 -- 容差判等
end
local total = 0.1 + 0.2
if near(total, 0.3) then
sendmsg(actor, 1, "裁决之杖折扣结算通过")
end
四、引擎验证:0.1 加 0.2 与 0.3 比对 100 万次:直等版 0 次通过;容差版 100 万次全通过,金额分位 0 错账。
五、FAQ:问:容差取多小?答:比业务最小单位小两个数量级,金额场景 1e-6 足够。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 线上事故:服务器闪断半分钟,重连后半小时打的经验金币全部蒸发——进度一直只在内存里,唯一的落档点挂在…
【游戏】 一、规则机制 隐蔽的坑:版本升级把存钱字段从 money 改名 gold,老玩家的档里还是旧键名,读档时取 gol…
【语法】 一、机制原理 一行代码拆解:local name = nick = "" and nick or "无名侠客"。这…
【游戏】 一、规则机制 抛个问题:怎么防止玩家把两把武器同时穿上刷双倍攻击?答案是把"槽位"作为唯一占位单位:武器、头盔、护…
【语法】 一、机制原理 线上事故:运营在后台上新活动,前端取配置 cfg.activity.reward.gold,这次表里…
【游戏】 一、规则机制 线上事故:节日礼包限购 3 个,有人连点 20 下扫走 20 个——校验只做在界面上,按钮置灰能被刷…