web-dev-qa-db-fra.com

Lua: Arrondir les nombres puis tronquer

Quel est le moyen le plus efficace d’arrondir un nombre puis de le tronquer (supprimer les décimales après arrondi)?

par exemple, si le nombre décimal est supérieur à 0,5 (c'est-à-dire 0,6, 0,7, etc.), je souhaite arrondir puis tronquer (cas 1). Sinon, j'aimerais tronquer (cas 2)

for example:
232.98266601563 => after rounding and truncate = 233 (case 1)
232.49445450000 => after rounding and truncate = 232 (case 2)
232.50000000000 => after rounding and truncate = 232 (case 2)
17
user1624552

Il n'y a pas de fonction math.round () intégrée dans Lua, mais vous pouvez effectuer les opérations suivantes: print(math.floor(a+0.5)).

23
Ola M

Une astuce utile pour arrondir les chiffres décimaux autres que les entiers consiste à transmettre la valeur à travers un texte mis en forme ASCII et à utiliser la chaîne de formatage %f pour spécifier l’arrondi souhaité. Par exemple

mils = tonumber(string.format("%.3f", exact))

arrondira la valeur arbitraire dans exact à un multiple de 0,001.

Un résultat similaire peut être obtenu avec la mise à l'échelle avant et après l'utilisation de l'une des fonctions math.floor() ou math.ceil(), mais il est parfois difficile de définir correctement les détails en fonction de vos attentes concernant le traitement des cas Edge. Non pas que ce ne soit pas un problème avec string.format(), mais beaucoup de travail a été fait pour que cela produise les résultats "escomptés".

Arrondir à un multiple de quelque chose d'autre qu'une puissance de dix nécessitera tout de même une mise à l'échelle, et aura toujours tous les cas difficiles Edge. Une approche simple à exprimer et à comportement stable consiste à écrire

function round(exact, quantum)
    local quant,frac = math.modf(exact/quantum)
    return quantum * (quant + (frac > 0.5 and 1 or 0))
end

et Tweak la condition exacte sur frac (et éventuellement le signe de exact) pour obtenir les cas Edge que vous vouliez.

11
RBerteig

Pour prendre également en charge les nombres négatifs, utilisez ceci:

function round(x)
  return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end
8
ggVGc

Voici un pour arrondir à un nombre arbitraire de chiffres (0 si non défini):

function round(x, n)
    n = math.pow(10, n or 0)
    x = x * n
    if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end
    return x / n
end
3
toma91

Devrait être math.ceil(a-0.5) pour gérer correctement les demi-nombres entiers

3
Egor Skriptunoff

Pour mauvais arrondi (couper la fin): 

function round(number)
  return number - (number % 1)
end

Eh bien, si vous voulez, vous pouvez développer ceci pour bien arrondir.

function round(number)
  if (number - (number % 0.1)) - (number - (number % 1)) < 0.5 then
    number = number - (number % 1)
  else
    number = (number - (number % 1)) + 1
  end
 return number
end

print(round(3.1))
print(round(math.pi))
print(round(42))
print(round(4.5))
print(round(4.6))

Résultats attendus:

3, 3, 42, 5, 5

0
Hastumer