Bagaimana cara menjumlahkan angka float dalam format jam dan menit?
Itu jika menghitung dua angka seperti 0.35+3.45
itu maka itu harus = 4.20
, bukan3.80
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);
});
Hasilnya harus seperti ini:
0
0.15
0.35
4.20
5.0
7.0
7.30
12.50
13.50
15.30
16.40
19.20
20.20
javascript
pengguna12916796
sumber
sumber
"."
untuk membagi string itu, bukan":"
.0.5
jam harus 30 menit, yang lain benar-benar tidak rasional. Saya harap ini bukan untuk klien dalam kehidupan nyata .. Entah bekerja dengan nilai float dari unit waktu yang tetap atau Anda memisahkan jam / menit. Sesimpel itu.Jawaban:
Cara terbaik untuk menangani format data "gila" seperti itu adalah dengan mengonversikannya menjadi format yang waras dan mudah diproses, lakukan apa pun yang perlu Anda lakukan dengan menggunakan data yang dikonversi dan akhirnya (jika Anda benar-benar harus) mengonversi hasilnya kembali ke format aslinya.
(Tentu saja, solusi nyata adalah berhenti menggunakan representasi waktu gila seperti itu sepenuhnya. Tapi itu tidak selalu praktis, misalnya karena Anda perlu berinteraksi dengan sistem lama yang tidak dapat Anda ubah.)
Dalam kasus Anda, format waras yang cocok untuk data Anda akan menjadi misalnya jumlah menit yang tidak terpisahkan. Setelah mengonversi data ke format ini, Anda dapat melakukan aritmatika biasa.
Perhatikan bahwa kode konversi di atas pertama kali mengalikan float input dengan 100 dan membulatkannya menjadi integer sebelum memisahkan bagian jam dan menit. Ini harus secara kuat menangani input dengan kemungkinan kesalahan pembulatan sambil menghindari kebutuhan untuk merumuskan input.
Alasan untuk lebih berhati-hati di sini adalah karena angka 0,01 = 1/100 (dan sebagian besar kelipatannya) sebenarnya tidak persis mewakili dalam format titik-mengambang biner yang digunakan oleh JavaScript. Dengan demikian Anda tidak dapat benar-benar memiliki nomor JS yang akan sama persis 0,01 - yang terbaik yang dapat Anda miliki adalah angka yang sangat dekat sehingga mengonversinya menjadi string akan secara otomatis menyembunyikan kesalahan. Tetapi kesalahan pembulatan masih ada, dan dapat menggigit Anda jika Anda mencoba melakukan hal-hal seperti membandingkan angka-angka tersebut dengan ambang yang tepat. Berikut ini adalah demonstrasi yang bagus dan sederhana:
sumber
Anda dapat menggunakan logika ini setelah melakukan penambahan aritmatika sederhana, ini akan mengubah jumlah menjadi format waktu
sumber
math.floor(sample/1)
bukannya adilmath.floor(sample)
?sample / 1
, saya pikir JS akan lantai itu sendiri karena tidak ada desimal di pembagi (seperti dalamsample / 1.0
, cukup lama sejak menggunakan JS;), Tapi itu tidak jadi saya dengan cepat googled dan menambahkanfloor
, lupa menghapusnya. Bagaimanapun terima kasih telah menunjukkan bahwaarr
bukan pada hasilnya. Misalnya, jikaarr = [1.5, 2.5]
hasilnya akan4
bukan4.4
Ini dia, implementasi dalam Javascript ES6. Saya melingkari setiap elemen, dan membagi jam, menit demi menit
.
, memeriksa apakah menit tidak ada, menetapkan 0 menghitung total jam dan menit dan menerapkan perhitungan yang diperlukan.sumber
Anda perlu mengubah semuanya menjadi jam atau menit, lalu menghitung.
sumber
Anda harus mengonversikannya menjadi jam dan menit terlebih dahulu
sumber
Bolehkah saya tahu mengapa Anda ingin hasil pertama menjadi 0 ? Di bawah ini adalah cara untuk melakukan ini dengan satu loop. Komentar ada dalam kode untuk dijelaskan. Dengan setiap loop kami menambahkan menit, dan jika mereka lebih besar dari 60, kami menambahkan satu jam, dan kemudian gunakan % 60 untuk mendapatkan menit yang tersisa. Mengapung bisa menyebalkan,
Jadi saya mengonversi angka menjadi string, dan kemudian kembali ke int.
sumber
toString().split('.');
- argh, benarkah?sumber
0.15 + 0.2
Kenapa=0.17
? Harus0.35
Cara standar untuk mengurangi modulus adalah dengan menambahkan defisit setelah penambahan jika terjadi overflow. Ini adalah bagaimana Anda akan melakukan penambahan BCD menggunakan perangkat keras biner misalnya.
Meskipun Anda bisa melakukan penambahan menggunakan pelampung dengan cara ini, ada pertanyaan apakah Anda harus melakukannya . Masalah dengan menggunakan angka float untuk beroperasi pada apa yang pada dasarnya jumlah integer sudah diketahui, dan saya tidak akan mengulanginya di sini.
Biasanya, penambahan pada pecahan float bekerja secara implisit dengan modulus 1,0, melimpah keluar dari fraksi menambah bagian bilangan bulat. Jika kita mengartikan titik sebagai pemisah Hours.minutes, maka kita ingin fraksi meluap pada 0,6. Ini membutuhkan defisit 0,4 untuk ditambahkan pada waktu yang tepat.
yang menghasilkan output berikut, koreksi ke dalam pembulatan ke apa yang diminta OP
Saya telah meninggalkan pemformatan terakhir ke dua tempat desimal sebagai latihan untuk pembaca. Ke 15 digit tambahan dalam semua kemuliaan menggambarkan bagian mengapa menggunakan pelampung bukanlah cara terbaik untuk melakukan ini.
Juga, pertimbangkan apa yang terjadi ketika Anda ingin memasukkan detik, atau hari. Dua cara yang lebih standar baik float detik, atau tuple of integer, tiba-tiba terlihat jauh lebih masuk akal.
sumber