数值 for 循环的步进用浮点数(如 0.1),学员期待精确走 10 步到 1.0——浮点 0.1 的二进制表示不精确,累加 10 次的实际值是 0.9999999999999999,循环次数不确定且可能永不等于 1.0。错误场景:
for x = 0, 1, 0.1 do
print(x)
end
浮点步进导致循环次数不确定(11 次而非 10 次)。
浮点步进改为整数步进加除法:for i = 0, 10 do x = i / 10 end——整数步进精确,除法在展示时才引入浮点。规范写法。示例代码如下:
for i = 0, 10 do
local x = i / 10
print(string.format("%.1f", x))
end
整数控制循环次数,除法控制展示精度,两者分离后循环行为确定。示例代码如下:
for frame = 1, 30 do
local t = frame / 30
setProgress(t)
end
30 帧动画用整数帧号控制,帧内除法计算进度比例。
三步验证:for x = 0, 1, 0.1 的循环次数用计数器实测(可能 11 次);整数步进加除法版本的循环次数精确为 11 次;string.format("%.17g", 0.1) 输出浮点 0.1 的真实二进制值。
浮点比较的安全写法是差值小于极小值:math.abs(a - b) < 1e-9 代替 a == b。示例代码如下:
local function nearlyEqual(a, b)
return math.abs(a - b) < 1e-9
end
print(nearlyEqual(0.1 + 0.2, 0.3))
0.1 加 0.2 的结果不精确等于 0.3,但差值在 1e-9 内判为相等。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:score = 3000 - used 10 —— 副本评分的全部骨架:基础分减去用时惩罚,分数…
【语法】 一、隐蔽陷阱:Lua 没有四舍五入函数,math.floor(2.5) 得 2 恒向负无穷取整——正数的四舍五入要…
【游戏】 一、业务场景:攻城战开打,会长世界喊话等人集合耽误 8 分钟,守军早已布防;集结令上线——会长发起,在线成员一键传…
【语法】 一、抛坑提问:乱序编号 {100, 4, 200, 1, 3, 2} 里最长连续段是 1 到 4 长度 4——排序…
【语法】 一、抛坑提问:统计第 1 到第 10 项,写 for i = 1, t - 1 少算一个,写 for i = 1,…
【游戏】 一、一行代码拆解:if old and old = actor then kick(old) end —— 顶号的…