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中文網其他相關文章!