Floating point 表索引中的Lua浮点错误

Floating point 表索引中的Lua浮点错误,floating-point,lua,Floating Point,Lua,通常,我比较两个浮点数,看它们是否在一个非常小的数字范围内。它不适用于表键,因为如果不知道它们的键(如果有意义的话),您就不知道它们是否存在 64位计算机上的lua 5.1示例: a,b,c=1.7,-0.8,-0.4 d=a+b+c——防止不断折叠 打印(字符串格式(“%1.20f',d))--0.4999999999989000(约0.5) 断言(d~=0.5) t={[0]='foo',[0.5]='bar'} print(t[d])--nil(我希望它打印'bar') 基本上,当考虑浮

通常,我比较两个浮点数,看它们是否在一个非常小的数字范围内。它不适用于表键,因为如果不知道它们的键(如果有意义的话),您就不知道它们是否存在

64位计算机上的lua 5.1示例:

a,b,c=1.7,-0.8,-0.4
d=a+b+c——防止不断折叠
打印(字符串格式(“%1.20f',d))--0.4999999999989000(约0.5)
断言(d~=0.5)
t={[0]='foo',[0.5]='bar'}
print(t[d])--nil(我希望它打印'bar')
基本上,当考虑浮点错误时,如何在表中找到键?我希望它在不与表中的每个键进行比较的情况下工作,因此在大表中仍然可以快速运行。可能已经有一个内置函数来完成这项工作,但我找不到


任何帮助都将不胜感激

如果您确实必须从来自不同来源的浮点数进行索引,我建议您将它们转换为固定格式的字符串,保留小数位数,并使用这些字符串对表进行索引


您甚至可以通过为代理表设置适当的
\uu newindex
元方法来自动实现这一点。

谢谢,我甚至没有想到这一点。另外,还有一个很好的新索引技巧!把它乘以一个固定的数字,然后使用
math.floor
@Deco,这也行,但你必须小心潜在的溢出。啊,没错。。。我没想过!LuaJIT的一个有趣的方法是将其转换为
long
,然后使用
ffi.string
(可能与union magic一起使用)。这将非常节省空间。。。但可能不值得这么努力。另外,@Ryan:为了固定小数位数,您可以执行
string.format('%.4f',num)