将lua中的数字与等式运算符进行比较有多安全?

Gha*_*nPL 3 double lua numbers equality

在我的引擎中,我有一个用于编写脚本的Lua VM.在脚本中,我写的内容如下:

stage = stage + 1
if (stage == 5) then ... end
Run Code Online (Sandbox Code Playgroud)

objnum = tonumber("5")
if (stage == objnum)
Run Code Online (Sandbox Code Playgroud)

根据Lua的消息来源,Lua在比较它使用的内部数字类型的双精度时使用了一个简单的相等运算符.

我知道处理浮点值时的精度问题,所以我想知道比较是否安全,也就是说,使用Lua的默认'=='操作简单地比较这些数字会有什么问题吗?如果是这样,是否有任何对策我可以确保1 + 2总是比较等于3?将值转换为字符串是否有效?

Pau*_*nko 8

可以通过转换为字符串,然后比较结果,如果你只关心在某些情况下平等会更好.例如:

> print(21, 0.07*300, 21 == 0.07*300, tostring(21) == tostring(0.07*300))
21      21      false   true
Run Code Online (Sandbox Code Playgroud)

当我给学生分配这些数字(0.07和300)并要求他们实施一个单元测试时,我学到了这种方法,然后惨遭失败抱怨21不等于21(它是比较实际数字,但显示字符串值).这是我们讨论比较浮点值的一个很好的理由.


Mud*_*Mud 1

我可以确保 1+2 总是等于 3 吗?

你不用担心。Lua 中的数字类型是double,它可以比 a 容纳更多的整数long int