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)
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))
.
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.
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
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
Devrait être math.ceil(a-0.5)
pour gérer correctement les demi-nombres entiers
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