首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当添加到数据库时,Laravel浮动变量的变化值

当添加到数据库时,Laravel浮动变量的变化值
EN

Stack Overflow用户
提问于 2014-06-03 20:38:54
回答 2查看 12.9K关注 0票数 5

理论

我有一个相当全面的坐标表(纬度和经度到小数点7位),我想继续添加。为了停止数据复制,对于试图输入的每个坐标,我想检查数据库,看看是否存在经度和纬度,在同一行。

检查坐标是否存在

代码语言:javascript
运行
复制
 $coordinate = DB::table('coordinates')
            ->where('lat', '=', $geocode->getLatitude())
            ->where('lng', '=', $geocode->getLongitude())
            ->count();

迁移

代码语言:javascript
运行
复制
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 --当我们谈论坐标时,这是一个完全不同的位置!

为什么十进制从我屏幕上的回音变为添加到数据库?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-03 20:49:53

更新:

我已经有一段时间没有使用MySQL了,所以我做了一些更多的研究。看起来类型有能力精确到65位。因为您只需要在小数点之前传递7位数字,在小数点之前传递3位数字,所以使用decimal(10,7)创建模式应该没有问题。

SQL Fiddle

假设您正在使用MySQL,那么您就没有什么可以做的了。根据文献资料floatdouble类型是近似表示:

浮动和双类型表示近似数值数据值。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)创建表。但是,如你所见,这仍然没有双倍精确。

票数 4
EN

Stack Overflow用户

发布于 2014-06-03 21:01:01

正如工头所说的..。用双装浮子..。

您还可以使用1E6表示法,这样它就可以保存为MySQL。

代码语言:javascript
运行
复制
53.7960957 * 1E6 = 537960957
537960957 / 1E6 = 53.7960957

这就是我用来保存地理坐标的方法

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24024515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档