La manière standard de réduire un module est d'ajouter le déficit après l'ajout en cas de débordement. C'est ainsi que vous feriez l'ajout de BCD en utilisant du matériel binaire par exemple.
Bien que vous puissiez faire des ajouts en utilisant des flottants de cette manière, il y a une question de savoir si vous devriez . Les problèmes liés à l'utilisation de nombres flottants pour opérer sur des quantités fondamentalement entières sont bien connus, et je ne vais pas les ressasser ici.
Normalement, l'addition sur les fractions flottantes fonctionne implicitement avec un module de 1,0, un débordement hors de la fraction incrémente la partie entière. Si nous interprétons le point comme le séparateur heures.minutes, nous voulons que la fraction déborde à 0,6. Il faut pour cela ajouter le déficit de 0,4 au moment opportun.
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));
});
qui produit la sortie suivante, correcte à l'intérieur d'un arrondi à ce que le PO a demandé
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
J'ai laissé le formatage final à deux décimales comme exercice pour le lecteur. Les 15 chiffres de fin dans toute leur splendeur illustrent en partie pourquoi l'utilisation de flotteurs n'est pas la meilleure façon de le faire.
Réfléchissez également à ce qui se passe lorsque vous souhaitez inclure des secondes ou des jours. Les deux méthodes plutôt standard de flottement des secondes, ou d'un tuple d'entiers, semblent tout à coup beaucoup plus sensées.