5 php latitude-longitude laravel eloquent laravel-4
理论
我有一个相当全面的坐标列表(纬度和经度到小数点后 7 位),我想不断添加。为了停止数据重复,对于尝试输入的每个坐标,我想检查数据库以查看同一行上的纬度和经度是否存在。
检查坐标是否存在
$coordinate = DB::table('coordinates')
->where('lat', '=', $geocode->getLatitude())
->where('lng', '=', $geocode->getLongitude())
->count();
Run Code Online (Sandbox Code Playgroud)
移民
Schema::create('coordinates', function(Blueprint $table)
{
$table->increments('id');
$table->float('lat', 10, 7);
$table->float('lng', 10, 7);
$table->timestamps();
});
Run Code Online (Sandbox Code Playgroud)
当用户的地址被转换时,我注意到当dd()
纬度变量时,它出来为:
float(53.7960957)
从代码 dd($geocode->getLatitude());
当我之后尝试将它添加到数据库时,通过删除dd()
,添加到数据库中的实际小数是53.7960968
- 当我们谈论坐标时完全不同的位置!
为什么小数点从屏幕上的回显变为添加到数据库中?
在添加之前是否需要将其转换为浮点数?我该如何解决这个问题?
更新:
我已经有一段时间没有使用MySQL了,所以我做了一些更多的研究。看起来该decimal
类型能够精确到 65 位数字。由于您只需要小数点后 7 位数字和小数点前 3 位数字,因此使用decimal(10,7)
.
假设您正在使用 MySQL,那么您无能为力。根据文档,float
和double
types 是近似表示:
FLOAT 和 DOUBLE 类型表示近似数值数据值。MySQL 使用 4 个字节表示单精度值,使用 8 个字节表示双精度值。
另请查看此SQL Fiddle,您将看到 MySQL 5.5.32 将表示浮点型53.7960957
as53.796100616455
和双精度型53.7960957
as 53.7960957
。您可能需要更新架构以使用双精度数,以提高精度。
您还可以使用非标准语法指定浮点数的精度(因此不建议这样做,以便可移植到其他 SQL 标准),方法是使用float(m,d)
wherem
是总位数,d
是小数点后的位数。例如,如果您希望允许小数点后最多 7 位精度的纬度/经度值(-180 到 180)……您应该能够使用float(10,7)
. 但是,正如您将看到的,这仍然不如 double 那样精确。
归档时间: |
|
查看次数: |
12010 次 |
最近记录: |