Mengapa Perbandingan Titik Terapung MySQL Tidak Tepat?

Susan Sarandon
Lepaskan: 2024-11-07 12:12:02
asal
456 orang telah melayarinya

Why Are MySQL Floating-Point Comparisons Inaccurate?

Ketidaksempurnaan Perbandingan Titik Terapung MySQL

Semasa memperkenalkan lajur titik terapung kepada skema pangkalan data MySQL terbukti berguna, perbandingan yang melibatkan nilai titik terapung kadangkala boleh menghasilkan hasil yang tidak boleh dipercayai.

Untuk menunjukkan:

Pertimbangkan jadual dengan lajur mata yang mengandungi nilai berikut:

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(all other values are less than 12.00)
Salin selepas log masuk

Melaksanakan pertanyaan:

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Salin selepas log masuk
Bolehkah Anda Teruskan Menggunakan Jenis Terapung?

Walaupun secara amnya disyorkan untuk menggunakan jenis data PERPULUHAN untuk perbandingan titik terapung yang tepat, anda masih boleh meneruskan dengan jenis apungan jika anda mengetahui tentang potensi perangkapnya. Salah satu perangkap sedemikian ialah potensi kehilangan ketepatan sedikit semasa pengiraan.

Sebagai contoh, mari kita pertimbangkan jadual berikut:

Menjalankan pertanyaan:

menghasilkan keputusan:
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);
Salin selepas log masuk

Perhatikan "0.00000005722" yang tidak dijangka. Ralat pembundaran sedemikian boleh membawa kepada percanggahan dalam perbandingan.
SELECT SUM(num) FROM a;
Salin selepas log masuk

Untuk mengurangkan isu sedemikian, anda boleh menukar lajur apungan kepada jenis data PERPULUHAN dengan ketepatan dan skala yang ditentukan. Contohnya:

159.94000005722
Salin selepas log masuk

Hasilnya kini menjadi:

Dengan menggunakan jenis data PERPULUHAN, anda boleh memastikan perbandingan yang tepat dan mengelakkan isu ketepatan yang dikaitkan dengan nilai titik terapung dalam MySQL .
ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Perbandingan Titik Terapung MySQL Tidak Tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan