【问题标题】:mysql database adding trailing 0 to decimalmysql数据库将尾随0添加到十进制
【发布时间】:2013-10-01 21:23:29
【问题描述】:

我有一个存储纬度和经度的数据库。我将纬度列设置为十进制 9,7,经度设置为十进制 10,7。当纬度是 9 个数字长时它工作正常,问题是如果纬度是 8 个数字长,它会在坐标后面添加一个 0。 phpmyadmin 中有没有办法防止这种情况发生?或者我应该在将它们添加到数据库之前用 php 对小数进行四舍五入?

【问题讨论】:

  • 这是在 php 中使用 db 时的问题,还是在 phpmyadmin 中查看数据时的美学问题?
  • 使用数据时出现问题,我正在尝试匹配 lat/lng,但由于正在添加的占位符 0,有时它会不匹配。
  • 从数据库中检索数据时,我会将值转换为 int(或使用 intval())。但是,我认为php应该自己做到这一点......你如何连接到mysql?
  • 我只用 js 计数,如果这个搜索的长度更短,则附加一个 0。以为我做错了什么,但我认为这就是它的工作方式。感谢您的回复。
  • 你首先要在哪里匹配?在 mysql 查询中,在 php 中?在任何一种情况下,都应该可以相应地转换类型,这可能会解决问题:在 php 中将两者都转换为浮点数,在 mysql CAST( your-val AS DECIMAL( 9, 7 ) )

标签: php mysql phpmyadmin gis latitude-longitude


【解决方案1】:

纬度和经度本质上是近似值,尤其是从 GPS 测量得出的值。这些是模拟量,并且是不精确的,以数字方式测量。

您不能比较其中两个值的相等性并期望事情正常工作;近似值不是这样工作的。它们本质上有点模糊。

如果你想知道例如 zip.long / zip.lat 是否等于 long / lat,你需要使用类似这样的 SQL 表达式。

 WHERE zip.long BETWEEN long - epsilon AND long + epsilon
   AND zip.lat  BETWEEN lat  - epsilon AND lat  + epsilon

如果您正在寻找 10 米的精度,epsilon 的值应为 0.00001268 (1.268e-05)。我们知道这一点是因为一个纬度是六十海里,而且很容易将海里转换为米。

您关于尾随零的问题暗示您正在使用字符串比较来匹配纬度和经度。也就是说,相对而言,比使用数值相等来比较数字这样的数字更具欺骗性。

顺便说一下,FLOAT 数据类型(32 位 IEEE 754 浮点数)对于纬度/经度来说具有足够的精度,除非您是测量员并且知道兰伯特投影和 UTM 投影之间的区别。

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 2018-11-20
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多