【问题标题】:Laravel float variable changing value when adding to database添加到数据库时Laravel浮动变量更改值
【发布时间】:2014-06-03 20:38:54
【问题描述】:

理论

我有一个相当全面的坐标列表(经纬度到小数点后 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 - 当我们谈论坐标时,位置完全不同!

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

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

【问题讨论】:

    标签: php laravel laravel-4 eloquent latitude-longitude


    【解决方案1】:

    更新:

    我有一段时间没有使用 MySQL,所以我做了更多的研究。看起来decimal type 能够精确到多达 65 位数字。由于您只需要 7 位通过小数点和 3 位小数点前,您应该没有问题使用 decimal(10,7) 创建模式。

    SQL Fiddle


    假设您使用的是 MySQL,您无能为力。根据the documentationfloatdouble类型是近似表示:

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

    同时查看SQL Fiddle,您会看到 MySQL 5.5.32 将 53.7960957 的浮点数表示为 53.796100616455,将 53.7960957 的双倍表示为 53.7960957。您可能希望更新您的架构以使用双精度数,以获得更高的精度。

    您还可以使用 float(m,d) 指定具有非标准语法的浮点数的精度(因此不推荐使用,以便移植到其他 SQL 标准),其中 m 是总位数,d 是位数小数点后的数字。例如,如果您想允许纬度/经度值(-180 到 180)在小数点后最多 7 位精度..您应该能够使用float(10,7) 创建表。但是,as you'll see,这仍然不如 double 精确。

    【讨论】:

    • MySQL 对Problems with Floating-Point Values 的引用也值得一读。
    • @Svengali 看到我的最后更新。原来decimal 最多可以精确到 65 位,而您只需要 10 位。
    【解决方案2】:

    正如前文所说的那样......使用 FLOAT 的 DOUBLE instad ...

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多