Почему этот SQL-запрос не возвращает никаких результатов, сравнивающих числа с плавающей запятой? - PullRequest
9 голосов
/ 12 января 2012

У меня есть это в таблице MySQL:

enter image description here

id и bolag_id равны int. lat и lngitude являются double.

Если я использую столбец lngitude, результаты не возвращаются:

lngitude Запрос: SELECT * FROM location_forslag WHERE Долгота = 13.8461208

Однако, если я использую столбец lat, он возвращает результаты:

lat Запрос: SELECT * FROM location_forslag WHERE lat = 58.3902782

В чем проблема с колонкой lngitude?

Ответы [ 3 ]

9 голосов
/ 12 января 2012

Обычно не рекомендуется сравнивать числа с плавающей запятой с помощью оператора =.

Для вашего приложения вынужно учитывать, насколько близко вы хотите, чтобы ответ был.

1 градус составляет около 112 км, а 0,00001 градуса - около 1,1 метра (на экваторе).Вы действительно хотите, чтобы ваше приложение говорило «не равно», если две точки различаются на 0,00000001 градус = 1 мм?

set @EPSLION = 0.00001  /* 1.1 metres at equator */

SELECT * FROM location_forslag 
WHERE `lngitude` >= 13.8461208 -@EPSILON 
AND `lngitude` <= 13.8461208 + @EPSILON

Это вернет точки, где lngitude находится в пределах @epsilon градусов от желаемого значения.Вам следует выбрать значение для epsilon, соответствующее вашему приложению.

4 голосов
/ 12 января 2012

Плавающие точки раздражают ....

 WHERE ABS(lngitude - 13.8461208) < 0.00000005
0 голосов
/ 05 ноября 2017

Преобразовать число с плавающей запятой в десятичное для сравнения. У меня была такая же проблема, и я решил ее так:

SELECT
    [dbo].[Story].[Longitude],
    [dbo].[Story].[Latitude],
    [dbo].[Story].[Location],
FROM
    [dbo].[Story],
    [dbo].[Places]
WHERE
    convert(decimal, [dbo].[Story].[Latitude]) = convert(decimal,  [dbo].[Places].[Latitude])
    and
    convert(decimal, [dbo].[Story].[Longitude]) = convert(decimal, [dbo].[Places].[Longitude])
    and
    [dbo].[Places].[Id] = @PlacesID 
    and
    [dbo].[Story].IsDraft = 0
ORDER BY
    [dbo].[Story].[Time] desc

Посмотрите на первые 3 строки после клаузулы WHERE. Надеюсь, это поможет.

...