Un trucco che è utile per l'arrotondamento in cifre decimali diversi numeri interi è quello di passare il valore attraverso il testo ASCII formattato, e utilizzare la stringa di formato %f
per specificare l'arrotondamento desiderato Ad esempio
mils = tonumber(string.format("%.3f", exact))
sarà arrotondare il valore arbitrario in exact
ad un multiplo di 0.001.
Un risultato simile si può avere con il ridimensionamento prima e dopo l'utilizzo di uno o di math.floor()
math.ceil()
, ma ottenere i particolari di destra secondo le vostre aspettative che circondano il trattamento di casi limite può essere difficile. Non che questo non sia un problema con string.format()
, ma è stato fatto molto lavoro per produrre risultati "previsti".
Arrotondare a un multiplo di qualcosa di diverso da una potenza di dieci richiederà ancora il ridimensionamento, e ha ancora tutti i casi più difficili. Un approccio che è semplice da esprimere e ha un comportamento stabile è quello di scrivere
function round(exact, quantum)
local quant,frac = math.modf(exact/quantum)
return quantum * (quant + (frac > 0.5 and 1 or 0))
end
e ottimizzare la condizione esatta su frac
(e, eventualmente, il segno della exact
) per ottenere i casi limite che volevi.
Dipende da cosa significa "correttamente". Bisogna decidere con cura cosa fare a mezzo passo e cosa fare con i valori negativi. Entrambi aggiungono metà e 'piano' e sottraggono una metà e' ceil' introducono una deviazione coerente al caso della metà esatta. Ed entrambi sono diversi dall'aggiunta della metà e troncati assumendo che il troncamento di solito giri verso lo zero. Implementare intorno al valore pari è più "giusto" in un certo senso. L'arrotondamento è irto di sottigliezza. – RBerteig