モジュラスを低減する標準的な方法は、オーバーフローが発生した場合、加算の後に赤字を加算することです。これは、たとえばバイナリハードウェアを使用してBCDを追加する方法です。
この方法でフロートを使用して加算を実行できますが、を実行する必要があるかどうかという疑問があります。基本的に整数の数量であるものを操作するために浮動小数点数を使用することに関する問題はよく知られているので、ここではそれらを再度ハッシュすることはしません。
通常、浮動小数の加算は、係数1.0で暗黙的に機能し、小数からのオーバーフローは整数部分をインクリメントします。ポイントを時間と分の区切りとして解釈する場合、小数部を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));
});
これは、次の出力を生成します。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
読者のための演習として、最終的なフォーマットを小数点以下2桁に残しました。栄光の中で最後の15桁は、フロートの使用がこれを行うための最良の方法ではない理由の一部を示しています。
また、秒数や日数を含めたい場合にどうなるかを検討してください。float秒、または整数のタプルのどちらかという2つの標準的な方法は、突然、より賢明に見えます。