Неправильно работает операция сравнения с числом 0.1

Вот запрос:

SELECT id, city, commision FROM sellers
WHERE commision > 0.1;

Вот вывод:

id city commision
'1', 'London', '0.12'
'2', 'San Jose', '0.13'
'3', 'New York', '0.1'
'4', 'London', '0.11'
'7', 'Barcelona', '0.15'

В выводе присутствует строка, у которой значение столбца commition равно 0.1, хотя в WHERE я пишу, что мне нужны только те строки, у которых commition > 0.1.
Тип commition - FLOAT. И, что интересно, для других чисел этого не наблюдается. Например, при запросе:

SELECT id, city, commision FROM sellers
WHERE commision > 0.12;

Получаем вывод:

'7', 'Barcelona', '0.15'
'2', 'San Jose', '0.13'

То есть строка со значениями столбцов '1', 'London', '0.12', как и дОлжно, пропускается.


Ответы (1 шт):

Автор решения: Miron

По сути числа с плавающей запятой(в двоичном представлении, не decimal) вычисляются так:

(-1)^бит_знака_числа * мантисса * 1010^экспанента.

В нашем случае(0.1) получается так:

(-1)⁰ * 1.0 * 1010⁻¹ = 1.0 / 1010

Разумеется, результат получается неточным:

https://www.exploringbinary.com/why-0-point-1-does-not-exist-in-floating-point/

Так в чем же хранить такие числа? Ответ - decimal. Но в данном случае получится число с фиксированной точкой, что ограничит нас, но зато никаких проблем с числом быть не должно.
При создании столбца на месте типа нужно указать DECIMAL(M, N), где M - кол-во чисел до точки, N - после. Больше информации по теме можно получить здесь.

→ Ссылка