Стандартний спосіб зменшити модуль - це додавання дефіциту після додавання, якщо викликано переповнення. Ось як можна зробити додавання BCD, використовуючи, наприклад, двійкове обладнання.
Хоча ви можете зробити доповнення, використовуючи поплавці таким чином, є питання, чи варто . Проблеми із застосуванням плаваючих чисел для роботи над загально цілими величинами добре відомі, і я не збираюся їх повторно переробляти тут.
Зазвичай додавання на поплавкові дроби функціонує неявно з модулем 1,0, переповнення фракції збільшує цілу частину. Якщо ми інтерпретуємо точку як роздільник годин.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 кінцевих цифр у всій красі ілюструють частину того, чому використання плавців не найкращий спосіб зробити це.
Також врахуйте, що відбувається, коли ви хочете включити секунди чи дні. Два радше стандартних способу або плаваючих секунд, або набору цілих чисел, раптом виглядають набагато розумнішими.