к примеру создать типы float5 и float6?
Зачем?
Примерно для таких запросов select latitude, longitude, count(1) from location.point group by round(latitude, 6), round(longitude, 6) Но с ним проблема [42883] ERROR: function round(double precision, integer) does not exist Подсказка: No function matches the given name and argument types. You might need to add explicit type casts. Позиция: 6
но там проблема не в этом
А в чем? Как лечить?
покажите пример данных пожалуйста
В latitude может быть что угодно от 55 до 55.9999999999999999999 так же с longitude 3356 и т.д
я бы кастил/триммил
а еще использовал бы postgis если еще не поздно, но тут меня могут заплевать коллеги по цеху
Можно пример?
Мне дубликаты найти надо и кол-во и потом возможно отчистить.
тогда кастите как удобный для вас формат и потом rtrim
Возьмите PostGIS и не парьтесь
Не тут как раз надо запарится чтоб на продуктив установить. А тут для начала надо попросту посчитать.
Можно пример? Достаточно такого вида. select round(55.635531177945, 6)
Если у вас есть операции с координатами - то закат солнца вручную это, конечно, увлекательно, но не слишком оптимально.
а что там за тип данных в поле сейчас? флот4?
Будем считать что операции float. Но я учту что с PostGIS будет шутсрее при частых выборках?
Просто float к float4 приводил чтоб посчитать. Так как round(longitude, 4) не завелся. Так же надо для 5 и 6 посчитать.
Там специально спроектированные типы данных и функции над ними - для расчёта дистанций, пересечений и т.п.
Гсподь с вами, никогда не используйте флот если есть хоть мизерный шанс этого избежать
а группировка по округлённым координатам вам тогда зачем?
не, ну почему, если на точность пофиг, а скорость вычислений важна... не так много таких случаев бывает, но бывают.
Будем считать что нужна группировка по float5 и 6 по примеру float4.
тогда приводите к типу, который можно триммить и вперед.
Что такое в вашем понимании float4? Если вы думаете что это float с 4 знаками после запятой, то это не так.
Можете пояснить? Просто результат получаю примерно одинаковый select round(55.635531177945, 6) --- 55.635531 select 55.635531177945::float4 --- 55.635532
https://postgrespro.ru/docs/postgrespro/14/datatype-numeric#DATATYPE-FLOAT Затрудняюсь что-нибудь к этому прибавить
С постгис того жэ по скорости и точности результата можно добиться мЕньшыми усилиями программистов.
На Си это относительно простая функцыя (один правильный & ), но 1) Именно для абсолютных координат это очень глубоко безсмысленно. 2) Вы, наверняка, непонимаете — что это округление будет делать т как, потому вряд ли его напишэте.
Мистер, float 4 и 8 -- это не количество десятичных цифр [после запятой], а сколько байт оно занимает. Знаков в них 9 и 19 соответственно. Эти конкретные типы поддержаны в процессоре, поэтому используют именно их. Если нужна точность где-то посередине, используйте всё равно float8 aka double
> Знаков в них 9 и 19 соответственно. Примерно 8 и примерно 16 (чуть меньшэ, на самом деле).
Спасибо! Я понял)
Да, вы правы. 53 двоичных знака, 53*lg2 = 15.95 Я перепутал, видимо, как раз с 10-байтовым, там 64 мантисса
Обсуждают сегодня