40
votes

Even though Lua does not differentiate between floating point numbers and integers, there are some cases when you want to use integers. What is the best way to covert a number to an integer if you cannot do a C-like cast or without something like Python's int?

For example when calculating an index for an array in

idx = position / width

how can you ensure idx is a valid array index? I have come up with a solution that uses string.find, but maybe there is a method that uses arithmetic that would obviously be much faster. My solution:

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

4 Answers

71
votes

You could use math.floor(x)

From the Lua Reference Manual:

Returns the largest integer smaller than or equal to x.

18
votes

Lua 5.3 introduced a new operator, called floor division and denoted by //

Example below:

Lua 5.3.1 Copyright (C) 1994-2015 Lua.org, PUC-Rio

>12//5

2

More info can be found in the lua manual

9
votes

@Hofstad is correct with the math.floor(Number x) suggestion to eliminate the bits right of the decimal, you might want to round instead. There is no math.round, but it is as simple as math.floor(x + 0.5). The reason you want to round is because floats are usually approximate. For example, 1 could be 0.999999996

12.4 + 0.5 = 12.9, floored 12

12.5 + 0.5 = 13, floored 13

12.6 + 0.5 = 13.1, floored 13

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

why not just use math.floor()? it would make the indices valid so long as the numerator and denominator are non-negative and in valid ranges.