假设我有一个rails模型叫做 Position
那两列呢 latitude
以及 longitude
(两者都定义为浮动)。我用一些位置值填充了模型。现在我试着根据纬度来确定位置:
positions = Position.where('positions.latitude = ?', 50.0)
返回nil。即使我试过这个:
lat = Position.first.latitude
positions = Position.where('positions.latitude = ?', lat)
结果是零。我的数据库是mysql用于生产。上面的代码是开发中的单词(sqlite)。我的假设是它与数据类型的处理方式有关,但我不明白。有人有什么想法吗?
2条答案
按热度按时间4bbkushb1#
不要使用
FLOAT
或者DOUBLE
当你需要精确的数值时。阅读https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
相反,使用
DECIMAL
或者NUMERIC
(它们是同义词)。看看我应该如何准确地存储纬度和经度?对于一些具体的指导
DECIMAL
用于纬度和经度的精度。ugmeyewa2#
这也许是因为 浮点数表示。用普通的相等比较法是不可能比较它们的。与其检查精确匹配,不如先检查数字是否在某个范围内,或者在比较之前将两个数字四舍五入到某个精度。
关于地理坐标的具体例子(我假设这是因为 纬度 我建议使用 十进制的 列类型而不是 浮动。
如果你想坚持 floatcolumn,我建议检查值是否在某个范围内。