모듈러스를 줄이는 표준 방법은 오버플로가 발생한 경우 추가 후 적자를 추가하는 것입니다. 예를 들어 바이너리 하드웨어를 사용하여 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 자리 숫자는 플로트를 사용하는 것이 가장 좋은 방법이 아닌 이유를 보여줍니다.
또한 초 또는 일을 포함 시키려고 할 때 어떤 일이 발생하는지 고려하십시오. float 초 또는 정수 튜플의 두 가지보다 표준적인 방법은 갑자기 훨씬 더 합리적으로 보입니다.