Ein Trick, der für die Rundung auf Dezimalstellen andere als ganze Zahlen zu übergeben Sie den Wert durch formatiert ASCII-Text, und verwenden Sie die %f
Format-String zu spezifizieren nützlich ist die gewünschte Rundung. Zum Beispiel
mils = tonumber(string.format("%.3f", exact))
den beliebigen Wert in exact
auf ein Vielfaches von 0.001 abzurunden.
Ein ähnliches Ergebnis kann mit der Skalierung vor und nach der Verwendung eines von math.floor()
oder math.ceil()
erzielt werden, aber die Details entsprechend Ihren Erwartungen in Bezug auf die Behandlung von Randfällen zu bekommen, kann schwierig sein. Nicht, dass dies kein Problem mit string.format()
, aber eine Menge Arbeit ist in die Herstellung von "erwarteten" Ergebnissen gegangen.
Um auf ein Vielfaches von etwas anderem als einer Zehnerpotenz zu runden, müssen Sie immer noch skalieren und haben immer noch alle schwierigen Kantenfälle. Ein Ansatz, der einfach auszudrücken und hat ein stabiles Verhalten ist
function round(exact, quantum)
local quant,frac = math.modf(exact/quantum)
return quantum * (quant + (frac > 0.5 and 1 or 0))
end
zu schreiben und optimieren den genauen Zustand auf frac
(und möglicherweise das Zeichen des exact
) die Rand Fällen bekommen Sie wollten.
Hängt davon ab was "richtig" bedeutet. Man muss sorgfältig entscheiden, was in etwa halben Schritten zu tun ist und was mit negativen Werten zu tun ist. Beide addieren eine Hälfte und "Boden" und subtrahieren Sie eine Hälfte und "ceil" einführen eine konsistente Neigung zum Fall der genauen Hälfte. Und beide unterscheiden sich von addieren die Hälfte und trunkieren unter der Annahme, dass die Trunkierung in der Regel in Richtung Null rundet. Round to-Value zu implementieren ist in gewissem Sinne "fairer". Die Rundung ist gespickt mit Subtilität. – RBerteig