理论

我有一个相当全面的坐标列表(纬度和经度到小数点后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,你可以做的不多。根据 文件, floatdouble 类型是近似表示:

FLOAT和DOUBLE类型表示近似数值数据值。MySQL使用四个字节表示单精度值,使用八个字节表示双精度值。

也看看这个 SQL小提琴, ,你会看到MySQL5.5.32将表示一个浮点数 53.7960957 作为 53.796100616455 还有一双 53.7960957 作为 53.7960957.您可能希望更新您的架构以使用双打,以获得更高的精度。

您还可以使用非标准语法指定浮点的精度(因此不推荐使用,以便可移植到其他SQL标准) float(m,d) 哪里 m 是总位数和 d 是小数后的位数。例如,如果您希望允许纬度/经度值(-180到180)在小数后最多7位精度。.您应该能够创建您的表 float(10,7).但是, 你会看到的, ,这仍然没有double那么精确。

其他提示

正如前奏者所说。..使用FLOAT的DOUBLE instad。..

你也可以使用1E6表示法,所以它将是一个整数保存是MySQL。

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

这是我用来保存geocoordinates的方式

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top