Точность чисел с плавающей точкой
По своей природе не все числа с плавающей точкой могут храниться с точной точностью. Архитектура оборудования, процессор или даже версия компилятора и уровень оптимизации могут повлиять на точность.
Если вы сравниваете DOUBLE или FLOAT с десятичными числами, не безопасно использовать оператор равенства.
Иногда изменение числа с плавающей точкой из одинарной точности (FLOAT) в двойную точность (DOUBLE) решит проблему.
Пример
f1, f2 и f3 кажутся идентичными по значениям в каждой строке, но из-за точности чисел с плавающей точкой результаты могут быть неожиданными.
CREATE TABLE fpn (id INT, f1 FLOAT, f2 DOUBLE, f3 DECIMAL (10,3)); INSERT INTO fpn VALUES (1,2,2,2),(2,0.1,0.1,0.1); SELECT * FROM fpn WHERE f1*f1 = f2*f2; +------+------+------+-------+ | id | f1 | f2 | f3 | +------+------+------+-------+ | 1 | 2 | 2 | 2.000 | +------+------+------+-------+
Причина, по которой была возвращена только одна строка вместо двух, становится понятной, когда мы видим, как были вычислены квадраты чисел с плавающей точкой.
SELECT f1*f1, f2*f2, f3*f3 FROM fpn; +----------------------+----------------------+----------+ | f1*f1 | f2*f2 | f3*f3 | +----------------------+----------------------+----------+ | 4 | 4 | 4.000000 | | 0.010000000298023226 | 0.010000000000000002 | 0.010000 | +----------------------+----------------------+----------+
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/floating-point-accuracy/