Cara standar untuk mengurangi modulus adalah dengan menambahkan defisit setelah penambahan jika terjadi overflow. Ini adalah bagaimana Anda akan melakukan penambahan BCD menggunakan perangkat keras biner misalnya.
Meskipun Anda bisa melakukan penambahan menggunakan pelampung dengan cara ini, ada pertanyaan apakah Anda harus melakukannya . Masalah dengan menggunakan angka float untuk beroperasi pada apa yang pada dasarnya jumlah integer sudah diketahui, dan saya tidak akan mengulanginya di sini.
Biasanya, penambahan pada pecahan float bekerja secara implisit dengan modulus 1,0, melimpah keluar dari fraksi menambah bagian bilangan bulat. Jika kita mengartikan titik sebagai pemisah Hours.minutes, maka kita ingin fraksi meluap pada 0,6. Ini membutuhkan defisit 0,4 untuk ditambahkan pada waktu yang tepat.
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));
});
yang menghasilkan output berikut, koreksi ke dalam pembulatan ke apa yang diminta OP
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
Saya telah meninggalkan pemformatan terakhir ke dua tempat desimal sebagai latihan untuk pembaca. Ke 15 digit tambahan dalam semua kemuliaan menggambarkan bagian mengapa menggunakan pelampung bukanlah cara terbaik untuk melakukan ini.
Juga, pertimbangkan apa yang terjadi ketika Anda ingin memasukkan detik, atau hari. Dua cara yang lebih standar baik float detik, atau tuple of integer, tiba-tiba terlihat jauh lebih masuk akal.