2012-03-11 58 views
26

Aunque Lua no diferencia entre números de coma flotante y enteros, hay algunos casos en los que desea usar enteros. ¿Cuál es la mejor manera de convertir un número en un número entero si no se puede hacer un molde tipo C o sin algo como el int de Python?Lua: convirtiendo de float a int

Por ejemplo en el cálculo de un índice para una matriz en

idx = posición/anchura

cómo se puede garantizar idx es un índice de la matriz válida? He encontrado una solución que usa string.find, pero tal vez hay un método que usa aritmética que obviamente sería mucho más rápido. Mi solución:

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 

Respuesta

41

Usted podría utilizar math.floor(x)

Desde el Lua Reference Manual:

Devuelve el mayor entero menor o igual a x.

+3

Puede ampliar esta respuesta para tratar los números negativos arrojando algunas barras: 'math.floor (math.abs (x))' – Ziggy

2

¿por qué no usar math.floor()? haría válidos los índices siempre que el numerador y el denominador no sean negativos y estén en rangos válidos.

3

@Hofstad es correcto con la sugerencia math.floor(Number x) para eliminar los bits a la derecha del decimal, es posible que desee redondear en su lugar. No existe math.round, pero es tan simple como math.floor(x + 0.5). La razón por la que desea redondear es porque los flotantes son generalmente aproximados. Por ejemplo, 1 podría ser 0,999999996

12,4 + 0,5 = 12,9, solado 12

12,5 + 0,5 = 13, solado 13

12,6 + 0,5 = 13,1, solado 13

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

Lua 5.3 introdujo un nuevo operador, llamado división del piso y denotado por //

ejemplo sopla

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

> 12 // 5

información más podría se puede encontrar en lua reference