1

我正在使用 gmaps4rails 并且为了存储来自用户标记的确切坐标,我使用字符串数据类型来表示纬度和经度。

但是,即使页面上的纬度/经度字段填充了整个数字(即37.7956059460017130.794677734375),当我检查日志时,这些是插入的数字:37.81813830.7336038。它们以某种方式近似?!

但是,如果我从编辑屏幕编辑该项目,则整个值都会毫无问题地存储。我可以在我的日志和数据库中看到这一点。

我还尝试使用小数(精度为 16,比例为 14)而不是字符串。但是,我的数据库仍然会存储一个长数字的近似部分,然后用 0 填充其余部分。例如,像这样的东西:44.31223760000000.

我使用 Ruby 2 和 Rails 4 和 mysql 作为数据库。但我认为问题出在 activerecord 上,因为它是将值存储在数据库中的那个?

这些来自我的新/编辑表单:

  <%= f.label :latitude %>
  <%= f.text_field :latitude %>

  <%= f.label :longitude %>
  <%= f.text_field :longitude %>

任何想法将不胜感激。谢谢!

4

1 回答 1

1

我猜有一些隐藏的转换正在发生。

您可以检查以下几点:

(1)每当您将数字打印到控制台时,都会生成输出to_s,至少 for floats 会将该值四舍五入。(只是返回的输出,而不是原始值)

例如(1.0/10).to_s返回"0.1"%.20f" % (1.0/10)返回"0.10000000000000000555"如果你试图找出你的问题,我建议你创建一个助手来打印出没有任何截断的十进制数字,或者找到另一种方式来显示你的值而不必质疑数字是否已经四舍五入或不。

(2)如果您使用字符串,ActiveRecord 没有理由截断您的输入。这将是许多应用程序会遭受的可怕错误。更有可能发生另一次转换,可能是类似value.to_f.to_s或类似的事情。您可以通过仅插入字符来测试它。如果您的值在数据库中最终为零或零,则您肯定有隐藏的转换。

(3)如果您使用小数,即BigDecimal确保您使用BigDecimalonly 而不是Float! 显式地或通过使用to_f. 这样你也会引入舍入问题

(4)您的数据也有可能无法完整地到达您的应用程序,这可能是因为 Javascript 或 HTML5 输入 ( type=number) 可能会降低精度。您可以通过在控制器操作中打印出整个params哈希来验证这一点。(使用pp或更好ap

(5)检查您的迁移。确保使用正确的精度,并且给定的精度应用于数据库。

于 2013-10-24T08:50:18.450 回答