為什麼 MySQL 浮點比較不準確?

Susan Sarandon
發布: 2024-11-07 12:12:02
原創
456 人瀏覽過

Why Are MySQL Floating-Point Comparisons Inaccurate?

MySQL 浮點比較缺陷

雖然將浮點列引入MySQL 資料庫模式被證明是有用的,但涉及浮點值的比較有時會產生結果不可靠的結果。

示範:

考慮一個包含以下值的點列的表:

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(all other values are less than 12.00)
登入後複製

執行查詢:

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
登入後複製

意外回傳「3 」。

眾所周知,MySQL 浮點值比較容易出現不一致,而十進位資料型態是這種比較的較好選擇。

您可以繼續使用浮點型嗎?

雖然通常建議使用 DECIMAL 資料類型進行精確浮點比較,但如果您知道的話,您仍然可以繼續使用浮點類型它的潛在陷阱。其中一個陷阱是計算過程中可能會出現輕微的精度損失。

例如,讓我們考慮下表:

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;
登入後複製

產生結果:

159.94000005722
登入後複製

注意的「0.00000005722」。此類舍入錯誤可能會導致比較差異。

要緩解此類問題,您可以將浮點數列轉換為具有指定精確度和小數位數的 DECIMAL 資料類型。例如:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
登入後複製

結果現在變成:

159.94
登入後複製

透過使用DECIMAL 資料類型,可以確保準確的比較並避免與MySQL 中的浮點值相關的精確度問題.

以上是為什麼 MySQL 浮點比較不準確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板