2

如您所知,浮点数有一个精度问题,即值 1 将是 0.9999999。而 lua 在 C 中使用 == 来检查两个双精度数是否相等。所以问题是:

a = 5.6
b = 14 * 0.4
print(a==b) ; => false

但更糟糕的是:

a = 1
...
if a < 1 then print("<1") end ; => sometimes a < 1 

那么我该如何避免呢?我查看了 lua 源代码,看来我可以修改 luaconf.h 中的 luai_numeq/luai_numle) 宏,但这有必要吗?

更新

第二个例子并不正确。实际上我的问题是,我将一个值 1 传递给 c/c++,它使用 lua_tonumber 来获取该值,并将这个值存储在一个 double 变量中,一段时间后,我将值 (lua_pushnumber) 推送到 lua,并且 a < 1发生了:

in lua:
my_cfunction(1)
...
in c:
int my_cfunction(lua_State *L) {
    double val = lua_tonumber(L, 1);
    ...
...
lua_pushnumber(L, val);

in lua:
local a = my_cfunction2()
if a < 1 then ... end
4

2 回答 2

5

如您所知,浮点数存在精度问题,即值 1 将是 0.9999999

我根本不知道。因为这不是真的。1.0 就是 1.0。这个:

a = 1
if a < 1 then print("<1") end

永远不会打印“<1”。除非你真的改变了a。即使这样:

a = 2
a = a - 1
if a < 1 then print("<1") end

也将永远不会击中print声明。

只要你对 Lua 的数字进行整数运算,你就会得到整数。整数值的加法、减法或乘法都不会给您留下非整数数值。

于 2012-05-10T02:12:18.590 回答
4

浮点数有精度问题

它没有。

与 32 位整数相比,64 位双精度数可以精确地保存更多的整数值。

于 2012-05-10T02:32:39.040 回答