Saya telah mewarisi tumpukan besar kode warisan yang ditulis dalam PHP di atas basis data MySQL. Hal yang saya perhatikan adalah aplikasi yang digunakan doubles
untuk penyimpanan dan manipulasi data.
Sekarang saya menemukan banyak posting yang menyebutkan bagaimana double
tidak cocok untuk operasi moneter karena kesalahan pembulatan. Namun, saya belum menemukan solusi lengkap tentang bagaimana nilai moneter harus ditangani dalam kode PHP dan disimpan dalam database MySQL.
Apakah ada praktik terbaik dalam menangani uang secara khusus dalam PHP?
Hal yang saya cari adalah:
- Bagaimana seharusnya data disimpan dalam database? jenis kolom? ukuran?
- Bagaimana seharusnya penanganan data dalam penambahan normal, pengurangan. perkalian atau pembagian?
- Kapan saya harus membulatkan nilainya? Berapa banyak pembulatan dapat diterima jika ada?
- Apakah ada perbedaan antara penanganan nilai moneter besar dan rendah?
Catatan: Sebuah SANGAT disederhanakan kode contoh dari bagaimana saya bisa menemukan nilai-nilai uang dalam kehidupan sehari-hari (berbagai masalah keamanan diabaikan untuk penyederhanaan Tentu saja dalam kehidupan nyata saya tidak akan menggunakan kode saya seperti ini.):
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
Saya harap Anda menggunakan kode sampel ini sebagai sarana untuk membawa lebih banyak kasus penggunaan dan tidak menerimanya secara harfiah.
Pertanyaan Bonus Jika saya menggunakan ORM seperti Doctrine atau PROPEL, betapa berbedanya menggunakan uang dalam kode saya.
decimal
tipe dalam C # memiliki presisi terbatas tetapi sangat cocok untuk nilai moneter.