Lua: 将浮点数转换为整数

尽管 Lua 不区分浮点数和整数,但有些情况下你需要使用整数。如果你不能执行类似 C 的强制类型转换或者没有像 Python 的 int 那样的函数,那么最好的方法是什么?

比如,在计算数组索引时:

idx = position / width

怎样确保 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

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

点赞
stackoverflow用户342551
stackoverflow用户342551

你可以使用 math.floor(x)

Lua 参考手册

返回不大于 x 的最大整数。

2012-03-11 12:12:47
stackoverflow用户255049
stackoverflow用户255049

为什么不直接使用 math.floor() 呢?只要分子和分母是非负数并且在有效范围内,这将使索引有效。

2012-03-11 12:15:32
stackoverflow用户7425597
stackoverflow用户7425597

@Hofstad 是正确的,用 math.floor(Number x) 的方法可以消除小数点后面的位数,但你可能想采用四舍五入的方式。虽然 Lua 中没有 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) -- 这里的 prec 是 10 的 n 次方,n 从 0 开始
end
2017-01-16 13:06:09
stackoverflow用户5527341
stackoverflow用户5527341

Lua 5.3 引入了一个新运算符,称为 floor division,并用 // 表示。

以下是示例:

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

12//5

2

更多信息可以在 lua manual 中找到。

2017-10-12 03:03:19