Плавающая переменная Laravel, изменяющая значение при добавлении в базу данных

StackOverflow https://stackoverflow.com//questions/24024515

Вопрос

Теория

У меня есть довольно полный список координат (широта и долгота с точностью до 7 знаков после запятой), который я хочу постоянно пополнять.Чтобы остановить дублирование данных, для каждой координаты, которую пытаются ввести, я хочу проверить базу данных, чтобы увидеть, существуют ли широта и долгота в одной строке.

Проверьте, существуют ли координаты

 $coordinate = DB::table('coordinates')
            ->where('lat', '=', $geocode->getLatitude())
            ->where('lng', '=', $geocode->getLongitude())
            ->count();

Миграция

Schema::create('coordinates', function(Blueprint $table)
        {
            $table->increments('id');
            $table->float('lat', 10, 7);
            $table->float('lng', 10, 7);
            $table->timestamps();
        });

Когда адрес пользователя преобразуется, я заметил, что когда dd() переменная широты, она выглядит как:

float(53.7960957) из кода dd($geocode->getLatitude());

Когда я попытаюсь впоследствии добавить его в базу данных, удалив dd(), фактическое десятичное число, добавляемое в базу данных, равно 53.7960968 - Совершенно другое местоположение, когда мы говорим о координатах!

Почему десятичное число меняется с эха на моем экране на добавление в базу данных?

Нужно ли мне преобразовать его в значение с плавающей точкой перед добавлением?Как я могу решить эту проблему?

Это было полезно?

Решение

Обновить:

Я давно не пользовался MySQL, поэтому провел еще кое-какие исследования.Это выглядит так, как будто decimal Тип имеет возможность быть точным до 65 цифр.Поскольку вам нужно всего 7 цифр после десятичной дроби и 3 перед десятичной дробью, у вас не должно возникнуть проблем с созданием схемы с decimal(10,7).

SQL Скрипка


Предполагая, что вы используете MySQL, вы мало что можете сделать.Согласно документация, float и double типы являются приблизительными представлениями:

Типы FLOAT и DOUBLE представляют приблизительные числовые значения данных.MySQL использует четыре байта для значений одинарной точности и восемь байт для значений двойной точности.

Также ознакомьтесь с этим SQL Скрипка, вы увидите, что MySQL 5.5.32 будет представлять собой значение с плавающей точкой 53.7960957 как 53.796100616455 и двойной из 53.7960957 как 53.7960957.Возможно, вы захотите обновить свою схему, чтобы вместо нее использовать удвоения, для немного большей точности.

Вы также можете указать точность значения float с нестандартным синтаксисом (поэтому это не рекомендуется для переносимости на другие стандарты SQL), используя float(m,d) где m это общее количество цифр и d это количество цифр после запятой.Например, если вы хотите разрешить значения широты / долготы (от-180 до 180) с точностью до 7 цифр после запятой .. вы должны иметь возможность создать свою таблицу с float(10,7).Но, как вы скоро увидите, это все еще было не так точно, как у double.

Другие советы

Как lefriter скажет ... использовать двойной Instad float ...

Вы также можете использовать 1E6 нотацию, чтобы было бы целое число для сохранения - MySQL.

53.7960957 * 1E6 = 537960957
537960957 / 1E6 = 53.7960957
.

Это так, как я использую для сохранения геокординатов

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top