Même si Lua ne fait pas de différence entre les nombres à virgule flottante et les entiers, il existe certains cas où vous souhaitez utiliser des entiers. Quelle est la meilleure façon de convertir un nombre en un entier si vous ne pouvez pas faire un cast de type C ou sans quelque chose comme int
de Python?
Par exemple, lors du calcul d'un index pour un tableau dans
idx = position/largeur
comment pouvez-vous vous assurer que idx
est un index de tableau valide? J'ai trouvé une solution qui utilise string.find
, mais il existe peut-être une méthode utilisant l'arithmétique qui serait évidemment beaucoup plus rapide. Ma 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
Vous pouvez utiliser math.floor(x)
Extrait du Manuel de référence Lua :
Renvoie le plus grand entier inférieur ou égal à x.
Lua 5.3
a introduit un nouvel opérateur, appelé floor division
et désigné par //
Exemple ci-dessous:
Lua 5.3.1 Copyright (C) 1994-2015 Lua.org, PUC-Rio
> 12 // 5
2
Plus d'informations peuvent être trouvées dans le manuel lua
@Hofstad est correct avec la suggestion math.floor(Number x)
pour éliminer les bits à droite de la décimale, vous voudrez peut-être arrondir à la place. Il n'y a pas de math.round
, Mais c'est aussi simple que math.floor(x + 0.5)
. La raison pour laquelle vous voulez arrondir est que les flottants sont généralement approximatifs. Par exemple, 1
Pourrait être 0.999999996
12,4 + 0,5 = 12,9, plancher 12
12,5 + 0,5 = 13, plancher 13
12,6 + 0,5 = 13,1, plancher 13
local round = function(a, prec)
return math.floor(a + 0.5*prec) -- where prec is 10^n, starting at 0
end
pourquoi ne pas simplement utiliser math.floor()
? cela rendrait les indices valides tant que le numérateur et le dénominateur sont non négatifs et dans des fourchettes valides.