Lua:从浮点数转换为整数

47
尽管Lua不区分浮点数和整数,但在某些情况下,您仍需要使用整数。如果无法像C语言一样进行强制转换或者没有类似Python的int这样的函数,那么最好的将数字转换为整数的方法是什么?
例如,在计算数组索引时,如何确保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
4个回答

82

你可以使用 math.floor(x)

Lua参考手册

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


9
你可以加上一些竖线来处理负数,使得这个答案适用于负数:math.floor(math.abs(x)) - Ziggy
3
好的,但在翻译后你需要把符号放回原处,否则你将转换为整数而且还会使用abs()函数。 - David Ljung Madison Stellar

23

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

以下是一个例子:

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

>12//5

2

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


...你可以使用除数为1的方法将负数和正数都四舍五入到最接近的整数(取整模式似乎是向负无穷方向)。 - James Groom

13

@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()? 只要分子和分母是非负数且在有效范围内,它将使索引有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接