【问题标题】:Lua interprets integer as non-integer numberLua 将整数解释为非整数
【发布时间】:2013-12-18 15:21:24
【问题描述】:

由于某种原因,如果我执行以下操作,Lua 不会将整数解释为整数:(integer%1 应该是 0,但在本例中我将展示它实际上是

x = 4
for i=1,25 do
  x = x - 0.04
end

print(x) -- 3
print(x%1) -- 1
print(math.ceil(x) == x) --false
print(math.ceil(x)) -- 3

可能这是一个错误,但有没有办法避免它?这对我来说真的很重要。 (不,我不能使用math.ceil(x),因为我不想将2.4 之类的数字解释为整数...

【问题讨论】:

  • 他试图教你如何从 cmd 复制和粘贴,而不是使用屏幕截图。对于您的问题,尽管尝试 print(("%0.15f"):format(x)) 您得到的 x 值,看看您会得到什么。那和missingno的答案应该告诉你你的问题。
  • 正如lua-users.org/wiki/NumbersTutorial 明确指出的那样:为了简单起见,Lua 只支持一种类型的数字,浮点数。因此,@missingno 的答案是您的完美解决方案。
  • 查看 Lua 5.3 的工作草案,它引入了整数类型:lua.org/work/doc/#changes

标签: lua numbers integer division


【解决方案1】:

这不是 Lua 特有的问题,几乎所有其他编程语言都会表现出类似的行为。

Floating point numbers 只能精确表示 2 的幂的倍数(这也包括整数)。由于 0.04 (1/25) 不是 2 的幂,因此您的中间值(包括 2.4)无法用浮点数精确表示,因此会有一些小的舍入误差。当您打印它们时它们看起来没问题,因为打印算法会记下最接近的小数,但内部表示将正好是 2.4

我建议重构您的程序以使用整数而不是小数。对于您的内部表示,保持一切乘以 25(所以 2.4 将是 60),并以 1 而不是 0.04 递增和递减。当您实际需要使用这些值时,您可以将它们除以 25 以获得不精确的浮点表示。

顺便说一句,尝试打印x-3。这将显示x 略小于3

【讨论】:

  • 所以在 25 次迭代中获得 4 次中的 3 次的唯一方法是将所有内容乘以 100,而不是除以 100?哦,这对我不利..
  • @user3050072:另一种选择是停止使用相等比较和 mod 运算符并开始使用更模糊的近似值(例如,不是测试两个数字是否相等,而是测试它们是否非常接近对彼此)。但是,如果您可以设法使用精确的整数,那么需要担心的事情就会少得多。您也可以使用decimal number luibrary,但这可能有点矫枉过正。
  • @user3050072 这假设你的 Lua 以浮点实现了 number 数据类型。实际上,源代码默认使用double,但源代码可以使用其他实现来构建。该语言不需要太多number
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2019-10-09
  • 2018-06-26
  • 2016-09-17
相关资源
最近更新 更多