【问题标题】:how to find float values in mysql database with rails如何使用rails在mysql数据库中查找浮点值
【发布时间】:2018-10-02 14:40:02
【问题描述】:

假设我有一个名为Position 的rails 模型和两列latitudelongitude(均定义为float)。我已经用一些位置值填充了模型。现在我正在尝试根据它的纬度找到位置:

positions = Position.where('positions.latitude = ?', 50.0)

返回零。 即使我试试这个:

lat = Position.first.latitude
positions = Position.where('positions.latitude = ?', lat)

结果为零。我的数据库是用于生产的 mysql。上面的代码在开发中的话(sqlite)。我的假设是它与数据类型的处理方式有关,但我不明白。有人有什么想法吗?

【问题讨论】:

    标签: mysql ruby-on-rails where-clause


    【解决方案1】:

    当您需要精确的数值时,不要使用FLOATDOUBLE

    阅读https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html

    改为使用DECIMALNUMERIC(它们是同义词)。

    请参阅 How accurately should I store latitude and longitude? 以获取有关用于纬度和经度的特定 DECIMAL 精度的一些指导。

    【讨论】:

      【解决方案2】:

      这可能与浮点数的表示方式有关。无法使用正常的相等比较来比较它们。与其检查完全匹配,不如先检查数字是否在一个范围内或将两个数字四舍五入到某个精度,然后再进行比较。

      关于地理坐标的特定示例(我假设这是因为使用了纬度),我建议使用小数列类型而不是浮点数。

      如果您想坚持使用 floatcolumn,我建议您检查该值是否在一个范围内。

      【讨论】:

      • 范围也不适合我。你是对的,我使用地理坐标,我使用浮点数的原因是 Rails 的地理编码器 gem 使用浮点数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2013-09-13
      • 2016-08-05
      • 1970-01-01
      相关资源
      最近更新 更多