添加到数据库时 Laravel 浮动变量更改值

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- 当我们谈论坐标时完全不同的位置!

为什么小数点从屏幕上的回显变为添加到数据库中?

在添加之前是否需要将其转换为浮点数?我该如何解决这个问题?

Sam*_*Sam 4

更新:

我已经有一段时间没有使用MySQL了,所以我做了一些更多的研究。看起来该decimal类型能够精确到 65 位数字。由于您只需要小数点后 7 位数字和小数点前 3 位数字,因此使用decimal(10,7).

SQL小提琴


假设您正在使用 MySQL,那么您无能为力。根据文档floatdoubletypes 是近似表示:

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

另请查看此SQL Fiddle,您将看到 MySQL 5.5.32 将表示浮点型53.7960957as53.796100616455和双精度型53.7960957as 53.7960957。您可能需要更新架构以使用双精度数,以提高精度。

您还可以使用非标准语法指定浮点数的精度(因此不建议这样做,以便可移植到其他 SQL 标准),方法是使用float(m,d)wherem是总位数,d是小数点后的位数。例如,如果您希望允许小数点后最多 7 位精度的纬度/经度值(-180 到 180)……您应该能够使用float(10,7). 但是,正如您将看到的,这仍然不如 double 那样精确。