如果lua数是double,则= /< = /> =操作总是正确的吗?

时间:2012-05-10 02:05:44

标签: lua floating-point

如您所知,浮点数存在精度问题,即值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传递给使用lua_tonumber获取值的c / c ++,并且我将此值存储在double变量中,并且在一段时间之后,我将值(lua_pushnumber)推送到lua,并且&lt; 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

2 个答案:

答案 0 :(得分:5)

  

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

我根本不知道。因为事实并非如此。 1.0是1.0。这样:

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

永远不会打印&#34;&lt; 1&#34;。除非您实际更改a,否则不会。即便如此:

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

同样也不会发表print声明。

只要你对Lua的数字执行整数运算,你就会得到整数。没有整数值的加法,减法或乘法将为您留下非整数数值。

答案 1 :(得分:4)

  

浮点有一个精度问题

It doesn't.

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