Dari sebuah artikel yang saya tulis untuk Authorize.Net :
Satu tambah satu sama dengan dua, kan? Bagaimana dengan .2 ditambah 1.4 dikalikan 10? Itu sama dengan 16, kan? Tidak jika Anda menghitung dengan PHP (atau sebagian besar bahasa pemrograman lainnya):
echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
Hal ini disebabkan bagaimana angka floating point ditangani secara internal. Mereka diwakili dengan jumlah tempat desimal yang tetap dan dapat menghasilkan angka yang tidak bertambah seperti yang Anda harapkan. Secara internal, .2 plus 1,4 kali 10 contoh kami menghitung kira-kira 15.9999999998 atau lebih. Jenis matematika ini baik-baik saja ketika bekerja dengan angka-angka yang tidak harus tepat seperti persentase. Tetapi ketika bekerja dengan uang, presisi penting karena satu sen atau satu dolar yang hilang di sana-sini bertambah dengan cepat dan tidak ada yang suka kekurangan uang.
Solusi Matematika BC
Untungnya PHP menawarkan ekstensi BC Math yaitu "untuk matematika presisi arbitrer PHP menawarkan Kalkulator Biner yang mendukung angka dari berbagai ukuran dan presisi, direpresentasikan sebagai string." Dengan kata lain, Anda dapat melakukan matematika yang tepat dengan nilai moneter menggunakan ekstensi ini. Ekstensi BC Math berisi fungsi s yang memungkinkan Anda melakukan operasi paling umum dengan presisi termasuk tambahan , pengurangan , perkalian , dan divisi .
Contoh yang Lebih Baik
Berikut adalah contoh yang sama seperti di atas tetapi menggunakan fungsi bcadd() untuk menghitungnya bagi kita. Dibutuhkan tiga parameter. Dua yang pertama adalah nilai yang ingin kita tambahkan dan yang ketiga adalah jumlah tempat desimal yang ingin kita teliti. Karena kita bekerja dengan uang, kita akan menyetel presisinya menjadi dua desimal.
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.