减少模量的标准方法是在引起溢出的情况下,在相加后相加缺陷。例如,这就是使用二进制硬件进行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));
});
会产生以下输出,并在四舍五入后修正为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
我将最终格式留给两位小数,以供读者练习。所有荣耀中的15个尾随数字都说明了为什么使用浮点数并不是做到这一点的最佳方法的部分原因。
另外,请考虑当您要包含秒或天时会发生什么。浮动秒数或整数元组的两种更为标准的方式突然显得更加明智。