Anomali Perbandingan Titik Terapung MySQL
Nombor titik terapung biasanya terkenal kerana menyebabkan hasil yang tidak dijangka dalam perbandingan kerana sifatnya yang tidak tepat. MySQL tidak terkecuali dalam tingkah laku ini.
Bayangkan senario ini: jadual MySQL dengan lajur bernama "titik" yang menyimpan nilai titik terapung. Apabila melaksanakan pertanyaan seperti:
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
anda mungkin menjangkakan ia akan mengembalikan 3, kerana terdapat empat nilai yang lebih besar daripada 12.75. Walau bagaimanapun, MySQL mungkin hanya mengembalikan 2.
Tingkah laku ini adalah akibat daripada cara aritmetik titik terapung dilaksanakan dalam komputer. Walaupun menyimpan nilai sebagai "12.75" atau "50.12" dalam kod kami, nilai ini selalunya disimpan secara dalaman sebagai anggaran.
Dalaman Kesilapan Aritmetik Titik Terapung
Kepada menggambarkan ini, mari kita ambil jumlah mudah beberapa nombor titik terapung:
CREATE TABLE a (num float); INSERT INTO a VALUES (50.12); INSERT INTO a VALUES (34.57); INSERT INTO a VALUES (12.75); INSERT INTO a VALUES (11.22); INSERT INTO a VALUES (10.46); INSERT INTO a VALUES (9.35); INSERT INTO a VALUES (8.55); INSERT INTO a VALUES (7.23); INSERT INTO a VALUES (6.53); INSERT INTO a VALUES (5.15); INSERT INTO a VALUES (4.01); SELECT SUM(num) FROM a;
Pertanyaan ini mungkin mengembalikan hasil seperti "159.94000005722" dan bukannya "159.94". "0.000000005722" tambahan itu adalah hasil daripada ralat pembundaran dalaman kepada aritmetik titik terapung.
Membetulkan Isu dengan Jenis PERPULUHAN
Untuk mengelakkan ketidaktepatan tersebut, disyorkan untuk gunakan jenis data DECIMAL. PERPULUHAN mewakili nilai sebagai rentetan dengan bilangan digit yang tetap, dan bukannya bergantung pada anggaran titik terapung.
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a;
Dengan perubahan ini, pertanyaan SUM akan mengembalikan hasil jangkaan "159.94".
Kesimpulan
Walaupun jenis titik terapung boleh menjadi mudah untuk sesetengah aplikasi, gelagat perbandingannya mungkin tidak boleh dipercayai dalam MySQL. Untuk perbandingan dan pengiraan yang tepat, adalah sangat disyorkan untuk menggunakan jenis data PERPULUHAN.
Atas ialah kandungan terperinci Mengapa MySQL mengembalikan hasil yang tidak dijangka apabila membandingkan nombor titik terapung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!