47

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
ddk
  • 1,813
  • 1
  • 15
  • 18

4 Answers4

81

You could use math.floor(x)

From the Lua Reference Manual:

Returns the largest integer smaller than or equal to x.

Hofstad
  • 981
  • 7
  • 4
22

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

Community
  • 1
  • 1
lin
  • 1,425
  • 1
  • 19
  • 27
  • ...which you can use with a divisor of `1` to round both negative and positive numbers to the nearest integer (the rounding mode appears to be towards -inf). – James Groom Aug 15 '23 at 20:45
12

@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
Community
  • 1
  • 1
Cody
  • 121
  • 1
  • 2
3

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.

Necrolis
  • 25,836
  • 3
  • 63
  • 101