Lua:从 float 转换为 int

问题描述 投票:0回答:5

尽管Lua不区分浮点数和整数,但在某些情况下你想使用整数。如果您无法进行类似 C 的转换或者没有 Python 的

int
之类的东西,那么将数字转换为整数的最佳方法是什么?

例如,计算

中数组的索引时

idx = 位置/宽度

如何确保

idx
是有效的数组索引?我想出了一个使用
string.find
的解决方案,但也许有一种使用算术的方法显然会快得多。我的解决方案:

function toint(n)
    local s = tostring(n)
    local i, j = s:find('%.')
    if i then
        return tonumber(s:sub(1, i-1))
    else
        return n
    end
end
lua floating-point
5个回答
85
投票

你可以使用

math.floor(x)

摘自Lua参考手册

返回小于或等于x的最大整数。


24
投票

Lua

5.3
引入了一个新的运算符,称为
floor division
,用
//

表示

以下示例:

Lua 5.3.1 版权所有 (C) 1994-2015 Lua.org,PUC-Rio

>12//5

2

更多信息可以在lua手册中找到


14
投票

@Hofstad 的

math.floor(Number x)
建议是正确的,即消除小数点右边的位,您可能需要四舍五入。没有
math.round
,但就像
math.floor(x + 0.5)
一样简单。您想要舍入的原因是因为浮点数通常是近似的。例如,
1
可以是
0.999999996

12.4 + 0.5 = 12.9,底数 12

12.5 + 0.5 = 13,落地 13

12.6 + 0.5 = 13.1,地板 13

local round = function(a, prec)
    return math.floor(a + 0.5*prec) -- where prec is 10^n, starting at 0
end

3
投票

为什么不直接使用

math.floor()
?只要分子和分母非负且在有效范围内,索引就有效。


0
投票

Hofstads 的答案很好,但是,它不能很好地处理负数,使其类似于 python 的

int
函数。

这是一个适用于负数的版本:

local function toint(f)
   if f > 0 then
      return math.floor(f)
   else
      return math.ceil(f)
   end
end

补充说明:

math.abs
解决方案也有效。您可能认为运行此
-math.floor(math.abs)
(额外的函数调用并使用
math.abs
函数)可能会使
math.abs
解决方案变慢。然而,对于 LuaJit,我没有注意到任何性能差异,因此可以使用您想要的任何解决方案。不过,上述解决方案可能适用于大多数版本的 lua。

© www.soinside.com 2019 - 2024. All rights reserved.