Rumah > pangkalan data > tutorial mysql > Mengapa MySQL mengembalikan hasil yang tidak dijangka apabila membandingkan nombor titik terapung?

Mengapa MySQL mengembalikan hasil yang tidak dijangka apabila membandingkan nombor titik terapung?

Linda Hamilton
Lepaskan: 2024-11-10 16:34:02
asal
849 orang telah melayarinya

Why does MySQL return unexpected results when comparing floating-point numbers?

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"
Salin selepas log masuk

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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!

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