Bir modülü azaltmanın standart yolu, taşma meydana geldiğinde ekleme işleminden sonra açığı eklemektir. Örneğin ikili donanım kullanarak BCD eklemeyi böyle yapardınız.
Eğer rağmen edebilirsiniz bu şekilde şamandıralar kullanılmadan ek yap, ister bir durum söz konusu olmalıdır . Temelde tamsayı miktarları üzerinde çalışmak için kayan sayıları kullanmanın problemleri iyi bilinmektedir ve burada onları yeniden şekillendirmeyeceğim.
Normal olarak, yüzdürme fraksiyonlarına ekleme 1.0 modüllü ile dolaylı olarak çalışır, kesirden taşma tam sayı kısmını arttırır. Noktayı hours.min Ayırıcı olarak yorumlarsa, kesirin 0.6'da taşmasını isteriz. Bunun için uygun zamanda 0,4 açığı gerekir.
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));
});
Bu, OP'nin istediği şeye yuvarlayarak, aşağıdaki çıktıyı üretir
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
Son biçimlendirmeyi okuyucu için bir alıştırma olarak iki ondalık basamağa bıraktım. Tüm görkemlerindeki 15 arka basamak, şamandıra kullanmanın neden bunu yapmanın en iyi yolu olmadığını gösterir.
Ayrıca, saniye veya gün eklemek istediğinizde neler olduğunu düşünün. Kayan saniyelerin ya da bir tamsayı dizisinin oldukça standart iki yolu aniden çok daha mantıklı görünüyor.