Il modo standard per ridurre un modulo è aggiungere il deficit dopo l'aggiunta se si è verificato un overflow. Questo è il modo in cui faresti l'aggiunta di BCD usando ad esempio l'hardware binario.
Anche se puoi fare l'aggiunta usando i float in questo modo, c'è una domanda se dovresti . I problemi con l'utilizzo dei numeri float per operare su quelle che sono sostanzialmente quantità intere sono ben noti e non li ripeterò qui.
Normalmente, l'aggiunta sulle frazioni float funziona implicitamente con un modulo di 1,0, un overflow della frazione incrementa la parte intera. Se interpretiamo il punto come separatore hours.minutes, vogliamo che la frazione trabocchi a 0,6. Ciò richiede che il disavanzo di 0,4 sia aggiunto al momento opportuno.
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));
});
che produce il seguente output, corretto all'interno di un arrotondamento a ciò che l'OP ha richiesto
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
Ho lasciato la formattazione finale a due cifre decimali come esercizio per il lettore. Le 15 cifre finali in tutta la loro gloria illustrano parte del perché l'uso dei float non è il modo migliore per farlo.
Inoltre, considera cosa succede quando vuoi includere secondi o giorni. I due modi piuttosto più standard di float secondi, o una tupla di numeri interi, sembrano improvvisamente molto più sensati.