Standardowym sposobem zmniejszenia modułu jest dodanie deficytu po dodaniu, jeśli nastąpiło przepełnienie. W ten sposób można dodawać BCD na przykład przy użyciu sprzętu binarnego.
Mimo, że można zrobić za pomocą pływaków dodatek w ten sposób, nie jest kwestia tego, czy powinien . Problemy z używaniem liczb zmiennoprzecinkowych do operowania na liczbach całkowitych są dobrze znane i nie zamierzam ich tutaj przerabiać.
Zwykle dodawanie ułamków swobodnych działa domyślnie z modułem 1,0, przelew z ułamka zwiększa część całkowitą. Jeśli interpretujemy punkt jako separator godzin. Minut, chcemy, aby ułamek przepełniał się przy 0,6. W tym celu należy dodać deficyt w wysokości 0,4.
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));
});
co daje następujący wynik, popraw w zaokrągleniu do tego, o co poprosił PO
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
Ostateczne formatowanie zostawiłem do dwóch miejsc po przecinku jako ćwiczenie dla czytelnika. 15 końcowych cyfr w całej okazałości ilustruje, dlaczego używanie pływaków nie jest najlepszym sposobem na zrobienie tego.
Zastanów się także, co się stanie, jeśli chcesz uwzględnić sekundy lub dni. Dwa raczej bardziej standardowe sposoby albo sekund zmiennoprzecinkowych, albo krotkę liczb całkowitych, nagle wyglądają na znacznie rozsądniejsze.