Die Standardmethode zum Reduzieren eines Moduls besteht darin, das Defizit nach dem Hinzufügen zu addieren, wenn ein Überlauf verursacht wurde. So würden Sie die BCD-Addition beispielsweise mit binärer Hardware durchführen.
Obwohl Sie können zusätzlich mit Schwimmern auf diese Weise zu tun, gibt es eine Frage, ob man sollte . Die Probleme bei der Verwendung von Gleitkommazahlen für Operationen mit im Wesentlichen ganzzahligen Mengen sind bekannt, und ich werde sie hier nicht erneut aufbereiten.
Normalerweise arbeitet die Addition von Float-Brüchen implizit mit einem Modul von 1,0, ein Überlauf aus dem Bruch erhöht den ganzzahligen Teil. Wenn wir den Punkt als Stunden.Minuten-Trennzeichen interpretieren, möchten wir, dass der Bruch bei 0,6 überläuft. Dazu muss das Defizit von 0,4 zum richtigen Zeitpunkt addiert werden.
function add_float_hours_minutes(a, b)
{
var trial_sum = a+b;
// did an actual overflow occur, has the integer part incremented?
if ( Math.floor(trial_sum) > Math.floor(a)+Math.floor(b) ) {
trial_sum += 0.4;
}
// has the fractional part exceeded its allotted 60 minutes?
if ( trial_sum-Math.floor(trial_sum) >= 0.6) {
trial_sum += 0.4;
}
return trial_sum;
}
var arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4]
var sum = 0.0;
arr.forEach(function(item) {
console.log(sum);
// sum += parseFloat(item);
sum = add_float_hours_minutes(sum, parseFloat(item));
});
Dies erzeugt die folgende Ausgabe, die innerhalb einer Rundung auf das korrigiert wird, was das OP verlangt hat
0
0.15
0.35
4.2
5.000000000000001
7.000000000000001
7.300000000000001
12.5
13.5
15.3
16.400000000000002
19.2
20.2
Ich habe die endgültige Formatierung als Übung für den Leser auf zwei Dezimalstellen belassen. Die 15 nachgestellten Ziffern in all ihrer Pracht veranschaulichen einen Teil dessen, warum die Verwendung von Floats nicht der beste Weg ist, dies zu tun.
Überlegen Sie auch, was passiert, wenn Sie Sekunden oder Tage einschließen möchten. Die beiden eher üblichen Methoden, entweder Sekunden oder ein Tupel von ganzen Zahlen zu schweben, sehen plötzlich viel sinnvoller aus.