理论
我有一个相当全面的坐标表(纬度和经度到小数点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 --当我们谈论坐标时,这是一个完全不同的位置!
为什么十进制从我屏幕上的回音变为添加到数据库?
在添加之前,是否需要将其转换为浮点数?我怎么解决这个问题?
发布于 2014-06-03 20:49:53
更新:
我已经有一段时间没有使用MySQL了,所以我做了一些更多的研究。看起来类型有能力精确到65位。因为您只需要在小数点之前传递7位数字,在小数点之前传递3位数字,所以使用decimal(10,7)创建模式应该没有问题。
SQL Fiddle
假设您正在使用MySQL,那么您就没有什么可以做的了。根据文献资料,float和double类型是近似表示:
浮动和双类型表示近似数值数据值。MySQL对单精度值使用四个字节,对双精度值使用八个字节.
还可以查看这个SQL Fiddle,您将看到MySQL 5.5.32将表示53.7960957的浮点数为53.796100616455,而53.7960957的浮点数为53.7960957。您可能希望更新您的架构以使用doubles,以获得更高的精度。
还可以使用float(m,d)指定非标准语法的浮点的精度(因此不建议将其移植到其他SQL标准),其中m是总位数,d是十进制之后的数字数。例如,如果您希望允许精度达到7位的纬度/经度值(-180到180),那么在decimal..you之后,应该能够使用float(10,7)创建表。但是,如你所见,这仍然没有双倍精确。
发布于 2014-06-03 21:01:01
正如工头所说的..。用双装浮子..。
您还可以使用1E6表示法,这样它就可以保存为MySQL。
53.7960957 * 1E6 = 537960957
537960957 / 1E6 = 53.7960957这就是我用来保存地理坐标的方法
https://stackoverflow.com/questions/24024515
复制相似问题