Ketik 0.1 + 0.2 ke dalam kalkulator di atas dan tekan sama dengan. Jawaban yang ditampilkan adalah 0.3 — karena alat ini membulatkan hasilnya hingga sepuluh tempat desimal sebelum menampilkannya. Namun, aritmatika mentah di baliknya menghasilkan 0.30000000000000004. Fragmen kecil itu tidak muncul begitu saja; itu adalah permukaan yang terlihat dari fenomena yang lebih dalam: setiap operasi floating-point meninggalkan sisa pembulatan, dan ketika Anda menggabungkan cukup banyak operasi, sisa-sisa itu dapat menumpuk menjadi kesalahan yang berarti.
Mengapa komputer tidak dapat menyimpan 0.1 secara tepat
Komputer menyimpan angka dalam biner — sistem angka satu dan nol. Sama seperti pecahan 1/3 tidak dapat ditulis secara tepat dalam desimal (menjadi 0.3333… selamanya), angka 0.1 tidak dapat ditulis secara tepat dalam biner. Yang paling dekat yang dapat dicapai komputer dalam format presisi ganda 64-bit yang digunakan oleh JavaScript — dan oleh setiap kalkulator berbasis browser — adalah sekitar 0.1000000000000000055511151231257827021181583404541015625.
Representasi ini diatur oleh standar IEEE 754, yang mendefinisikan bagaimana semua prosesor modern menangani angka desimal. Standar ini menjamin bahwa setiap operasi aritmatika mengembalikan hasil representasi terdekat — tetapi "terdekat" bukan berarti "tepat." Jarak itu, sekecil apa pun, adalah kesalahan pembulatan menurut definisi.
Bagaimana kesalahan tumbuh melalui rantai
Satu kesalahan pembulatan sebesar 5 × 10⁻¹⁷ tidak terasa. Yang menjadi perhatian adalah apa yang terjadi ketika Anda menggunakan hasil yang sedikit meleset itu sebagai input untuk operasi berikutnya, dan hasil itu memberi makan operasi setelahnya, dan seterusnya. Seperti yang dijelaskan artikel Wikipedia tentang kesalahan pembulatan: "Ketika serangkaian perhitungan dengan input yang melibatkan kesalahan pembulatan dilakukan, kesalahan dapat menumpuk, terkadang mendominasi perhitungan."
Dua mekanisme yang mendorong pertumbuhan ini:
- Pergerakan aditif — dalam penjumlahan panjang (menjumlahkan banyak nilai kecil), setiap penjumlahan dapat membulatkan ke arah yang sama. Kesalahan individu tidak saling meniadakan; mereka menumpuk. Menjumlahkan seribu angka yang masing-masing membawa kesalahan
10⁻¹⁵dapat menghasilkan kesalahan akhir sekitar10⁻¹²— masih kecil secara absolut, tetapi sejuta kali lebih besar dari kesalahan per langkah. - Pembatalan pengurangan — mengurangkan dua angka yang hampir sama dapat memperbesar kesalahan relatif secara tajam. Jika kedua nilai tidak tepat pada tempat desimal ke-15 dan 14 digit pertama saling meniadakan, kesalahan kini mendominasi apa yang tersisa. Kalkulator menggunakan ini dalam identitas trigonometri dan kasus pembatalan hampir sama lainnya, itulah sebabnya fungsi trigonometri mereka diimplementasikan dengan perhatian khusus.
Contoh konkret dari pembulatan berulang
Membulatkan angka pada setiap langkah daripada di akhir menghasilkan kesalahan majemuk yang lebih besar daripada satu kali pembulatan. Bulatkan 9.945309 ke dua tempat desimal dan Anda mendapatkan 9.95 (kesalahan: 0.0047). Bulatkan itu ke satu tempat desimal dan Anda mendapatkan 10.0 (total kesalahan: 0.055). Membulatkan sekaligus dalam satu langkah — 9.945309 ke satu desimal — menghasilkan 9.9, dengan total kesalahan hanya 0.045. Jalur dua langkah memperkenalkan kesalahan ekstra karena pembulatan pertama mendorong nilai melewati ambang berikutnya.
Inilah sebabnya perhitungan yang menunjukkan hasil antara — misalnya, menyalin nilai yang dibulatkan dari satu perhitungan ke perhitungan berikutnya — dapat menghasilkan jawaban akhir yang sedikit berbeda dibandingkan menjaga semua presisi dalam satu ekspresi utuh.
Apa yang dilakukan kalkulator untuk mengelola ini
Kalkulator di atas menerapkan langkah pembulatan akhir setelah mengevaluasi setiap ekspresi: hasil floating-point mentah dibulatkan hingga sepuluh tempat desimal sebelum ditampilkan. Kode internal menggunakan Math.round(result * 1e10) / 1e10, yang membersihkan sisa floating-point untuk sebagian besar perhitungan sehari-hari. Itulah mengapa 0.1 + 0.2 ditampilkan sebagai 0.3 daripada 0.30000000000000004 mentah.
Ini adalah pilihan pragmatis: menghilangkan gangguan kebisingan di akhir sebagian besar hasil. Ini juga berarti kalkulator tidak akan menampilkan kesalahan yang jauh lebih kecil dari 10⁻¹⁰, terlepas dari bagaimana kesalahan itu muncul. Untuk sebagian besar perhitungan praktis — pekerjaan rumah, anggaran, perkiraan teknik — sepuluh tempat desimal signifikan adalah presisi lebih dari cukup, jadi pembulatan ini adalah fitur, bukan kompromi.
Kapan kesalahan terkumpul benar-benar penting
Untuk penggunaan sehari-hari, kesalahan pembulatan terkumpul jarang menjadi masalah. Ini menjadi relevan dalam situasi berikut:
- Penjumlahan sangat panjang — menambahkan ratusan angka keuangan atau hasil pengukuran secara manual, langkah demi langkah, bukan dalam satu ekspresi.
- Rumus iteratif — perhitungan di mana keluaran memberi umpan balik sebagai input berikutnya selama banyak siklus, seperti bunga majemuk selama ratusan periode.
- Pembatalan hampir sama — mengurangkan dua kuantitas yang hampir sama, yang dapat memperlihatkan sisa pembulatan yang biasanya tersembunyi jauh di sebelah kanan.
- Pembulatan antara secara manual — menyalin hasil antara yang dibulatkan ke langkah berikutnya daripada mempertahankannya dalam ekspresi yang sama.
Mitigasi praktisnya sederhana: masukkan seluruh rumus dalam satu ekspresi bila memungkinkan, hindari pembulatan nilai antara secara manual, dan anggap hasil dengan banyak tempat desimal sebagai perkiraan, bukan jawaban tepat jika ada nilai input Anda yang juga perkiraan.
Periksa sendiri: ketik0.1 + 0.2ke dalam kalkulator di atas — Anda akan melihat0.3. Tampilan dibersihkan, tetapi aritmatika di baliknya tidak tepat. Untuk rantai langkah panjang, pertahankan ekspresi penuh dalam satu baris bila memungkinkan: kalkulator menangani pembulatan terkumpul secara internal, bukan Anda yang memperkenalkan pergeseran ekstra dengan menyalin nilai antara yang dibulatkan secara manual.