Плавающая переменная Laravel, изменяющая значение при добавлении в базу данных
-
21-12-2019 - |
Вопрос
Теория
У меня есть довольно полный список координат (широта и долгота с точностью до 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)
.
Предполагая, что вы используете 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
.
Это так, как я использую для сохранения геокординатов