如果Lua数字是双精度浮点型,那么= / <=/>=操作总是正确的吗?

你知道,浮点数存在一个精度问题,即值为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_num_eq/luai_num_le宏,但这是必要的吗?

更新

第二个例子实际上不是很准确。实际上我的问题是,我将一个值为1的参数传递给C/C++,使用lua_tonumber获取该值,然后将其存储在双精度变量中,并在一定时间后向Lua中推送该值(lua_pushnumber),导致a<1的情况发生:

在Lua中:
my_cfunction(1)
...
在C中:
int my_cfunction(lua_State *L) {
    double val = lua_tonumber(L, 1);
    ...
...
lua_pushnumber(L, val);

在Lua中:
local a = my_cfunction2()
if a < 1 then ... end

原文链接 https://stackoverflow.com/questions/10526615

点赞
stackoverflow用户734069
stackoverflow用户734069

你知道的,浮点数存在精度问题,即值 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-10 02:12:18
stackoverflow用户501459
stackoverflow用户501459

浮点数有精度问题

事实并非如此。

一个 64 位双精度浮点数可以准确地存储比 32 位整数更多的整数值。

2012-05-10 02:32:39