# Panduan Solusi Permanen Floating-Point Bug (MariaDB 10.3 & PHP 5.6)

Dokumen ini berisi Standard Operating Procedure (SOP) untuk memperbaiki masalah presisi desimal (`29999.9999999990` menjadi bulat `30000`) dari sisi database maupun aplikasi secara permanen.

---

## 1. Perbaikan di Tingkat Database (MariaDB 10.3)

Akar masalah pembulatan ini terjadi karena kolom `tagihan` menggunakan tipe data `FLOAT` atau `DOUBLE` yang menyimpan angka berdasarkan perkiraan biner. Solusinya adalah mengubah tipe data kolom menjadi `DECIMAL` (nilai pasti).

Jalankan perintah SQL berikut secara berurutan:

```sql
-- Langkah 1: Bersihkan data rusak yang telanjur ada dengan membulatkannya ke bilangan bulat terdekat
UPDATE `transaksi_ua...g_muka_sourc` 
SET `tagihan` = ROUND(`tagihan`, 0) 
WHERE `id` = 3078;

-- Langkah 2: Ubah tipe data kolom menjadi DECIMAL (15 digit total, 2 digit di belakang koma)
ALTER TABLE `transaksi_ua...g_muka_sourc` 
MODIFY COLUMN `tagihan` DECIMAL(15,2) NOT NULL DEFAULT '0.00';
```

*Hasil:* Struktur tabel diperbaiki secara permanen. Angka di database otomatis terkonversi rapi menjadi `30000.00` tanpa ada deretan angka sembilan desimal lagi.

---

## 2. Pengamanan di Tingkat Aplikasi (PHP 5.6)

Meskipun database sudah menggunakan `DECIMAL`, PHP 5.6 bawaannya tetap bisa memicu *floating-point bug* jika Anda melakukan operasi matematika finansial menggunakan operator dasar (`+`, `-`, `*`, `/`).

### A. Gunakan Ekstensi BC Math untuk Kalkulasi
Ganti semua kalkulasi nilai uang di script PHP Anda menggunakan fungsi **BC Math**. Fungsi ini memproses angka keuangan sebagai teks string sehingga akurasinya terjaga 100%.

```php
<?php
// Contoh variabel awal (DPP dan PPN)
\$dpp = "27027.03";
\$ppn = "2972.97";

// JANGAN GUNAKAN: \$total = \(dpp +\)ppn; (Rentan memicu bug desimal di PHP 5.6)

// GUNAKAN BC MATH: bcadd(angka1, angka2, jumlah_desimal)
\$total_tagihan = bcadd(\(dpp,\)ppn, 2); // Hasil pasti konsisten: "30000.00"

// Jalankan Query ke MariaDB menggunakan hasil dari BC Math
\$query = "UPDATE transaksi_ua...g_muka_sourc SET tagihan = '\$total_tagihan' WHERE id = 3078";
// ... eksekusi query ke database ...
?>
```

### B. Format Tampilan untuk Konsumen (Frontend)
Saat menampilkan data dari database ke layar aplikasi atau cetak struk/invoice, gunakan fungsi `number_format` untuk membuang pecahan desimal `.00` agar konsumen melihat angka bulat rapi.

```php
<?php
// Nilai dari database setelah tabel diubah ke DECIMAL (30000.00)
\(tagihan_dari_db =\)row['tagihan']; 

// Tampilkan dengan format Rupiah tanpa sen
echo "Rp " . number_format(\$tagihan_dari_db, 0, ',', '.'); 
// Hasil di layar: Rp 30.000
?>
```

---

## 3. Kesimpulan Manfaat Solusi

Dengan menggabungkan **`DECIMAL` di MariaDB 10.3** dan **`BC Math` di PHP 5.6**, celah kebocoran presisi biner telah ditutup dari hulu ke hilir.
* **Integritas Data:** Data laporan keuangan di database dijamin 100% akurat.
* **Hak Konsumen:** Uang muka konsumen tersimpan utuh dan bebas digunakan untuk pelunasan transaksi lain tanpa terganggu masalah pembulatan sistem.
