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小提琴, ,你会看到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的方式