Cách tiêu chuẩn để giảm mô-đun là thêm thâm hụt sau khi thêm nếu xảy ra tràn. Đây là cách bạn thực hiện bổ sung BCD bằng phần cứng nhị phân chẳng hạn.
Mặc dù bạn có thể thực hiện bổ sung bằng cách sử dụng phao theo cách này, có một câu hỏi là liệu bạn có nên . Các vấn đề với việc sử dụng số float để vận hành với số lượng cơ bản là số nguyên đã được biết đến và tôi sẽ không thử lại chúng ở đây.
Thông thường, phần bổ sung trên phân số float hoạt động hoàn toàn với mô đun 1.0, phần tràn ra khỏi phân số làm tăng phần nguyên. Nếu chúng ta giải thích điểm là dấu phân cách hours.minutes, thì chúng ta muốn phân số tràn vào 0,6. Điều này cần thâm hụt 0,4 để được thêm vào thời điểm thích hợp.
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));
});
tạo ra đầu ra sau, chính xác trong vòng làm tròn với những gì OP yêu cầu
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
Tôi đã để lại định dạng cuối cùng đến hai chữ số thập phân như một bài tập cho người đọc. 15 chữ số kéo dài trong tất cả vinh quang của họ minh họa một phần lý do tại sao sử dụng phao không phải là cách tốt nhất để làm điều này.
Ngoài ra, hãy xem xét những gì xảy ra khi bạn muốn bao gồm giây hoặc ngày. Hai cách khá chuẩn hơn là giây trôi nổi, hoặc một bộ số nguyên, đột nhiên trông hợp lý hơn rất nhiều.