Стандартный способ уменьшить модуль - добавить дефицит после добавления, если было вызвано переполнение. Вот как бы вы добавили BCD, например, используя двоичное оборудование.
Хотя вы можете сделать добавление с помощью поплавка таким образом, есть вопрос о том , вы должны . Проблемы с использованием чисел с плавающей точкой для работы с целочисленными величинами хорошо известны, и я не буду их здесь перефразировать.
Как правило, сложение дробных дробей работает неявно с модулем 1,0, переполнение дробной части увеличивает целочисленную часть. Если мы интерпретируем точку как разделитель hours.minutes, то мы хотим, чтобы дробь переполнилась на 0,6. Для этого необходимо добавить дефицит 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));
});
который выдает следующий результат, с точностью до округления до того, что запрашивал ОП
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
Я оставил окончательное форматирование до двух знаков после запятой в качестве упражнения для читателя. 15 последних цифр во всей их красе иллюстрируют, почему использование поплавков - не лучший способ сделать это.
Кроме того, подумайте, что происходит, когда вы хотите включить секунды или дни. Два довольно более стандартных способа с плавающей запятой или с целым числом целых чисел, внезапно выглядят более разумными.