Неправильно работает операция сравнения с числом 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 шт):
По сути числа с плавающей запятой(в двоичном представлении, не decimal) вычисляются так:
(-1)^бит_знака_числа * мантисса * 1010^экспанента.
В нашем случае(0.1) получается так:
(-1)⁰ * 1.0 * 1010⁻¹ = 1.0 / 1010
Разумеется, результат получается неточным:
Так в чем же хранить такие числа? Ответ - decimal. Но в данном случае получится число с фиксированной точкой, что ограничит нас, но зато никаких проблем с числом быть не должно.
При создании столбца на месте типа нужно указать DECIMAL(M, N), где M - кол-во чисел до точки, N - после. Больше информации по теме можно получить здесь.
