Lua: conversion de float en int
Même si Lua ne fait pas de différence entre les nombres à virgule flottante et les entiers, il y a des cas où vous voulez utiliser des entiers. Quelle est la meilleure façon de cacher un nombre à un entier si vous ne pouvez pas faire une distribution 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 peut-être qu'il y a une méthode qui utilise 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
4 réponses
Lua 5.3 introduit un nouvel opérateur, appelé floor division et désigné par / /
Exemple de coups
Lua 5.3.1 Copyright (c) 1994-2015 Lua.org, PUC-Rio
>12//5
2
Plus d'informations peuvent être trouvées dans Lua reference
@Hofstad est correct avec la suggestion math.floor(Number x)
pour éliminer les bits à droite de la décimale, vous pouvez arrondir à la place. Il n'y a pas de mathématiques.rond, mais il est aussi simple que math.floor(x + 0.5)
. La raison pour laquelle vous voulez arrondir est parce que les flotteurs sont généralement approximative. Par exemple, 1 peut être 0.999999996
12.4 + 0.5 = 12.9, parqueté 12
12.5 + 0.5 = 13, parqueté 13
12.6 + 0.5 = 13.1, parqueté 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 ne sont pas négatifs et dans des plages valides.