我正在使用gmaps4rails,为了存储用户标记的确切坐标,我使用字符串数据类型作为纬度和经度。
但是,即使页面上的lat / long字段填满了整个数字(即37.79560594600171
和30.794677734375
),当我检查日志时,这些是插入的数字: 37.818138
和30.7336038
。它们是以某种方式近似的?!
但是如果我从编辑屏幕编辑该项目,则存储的所有值都没有问题。我可以在我的日志和数据库中看到它。
我也尝试过使用小数(16位精度和14位)代替字符串。但是,我的数据库只存储一个长数的近似部分,然后用0填充其余部分。例如,类似这样的事情:44.31223760000000
。
我使用Ruby 2和Rails 4以及mysql作为数据库。但我认为这个问题会以某种方式与activerecord有关,因为它是在db中存储值的那个?
这些来自我的新/编辑表格:
<%= f.label :latitude %>
<%= f.text_field :latitude %>
<%= f.label :longitude %>
<%= f.text_field :longitude %>
任何想法都会受到赞赏。谢谢!
答案 0 :(得分:1)
我猜测正在发生一些隐藏的转换。
以下是您可以查看的一些内容:
(1)每当您向控制台打印数字时,输出都由to_s
生成,至少对于浮点数会对值进行舍入。 (只是返回的输出,而不是原始值)
例如(1.0/10).to_s
会返回"0.1"
,但%.20f" % (1.0/10)
会返回"0.10000000000000000555"
如果您尝试搜索问题,我建议您创建一个帮助程序来打印出十进制数字首先没有任何功能,或者找到另一种方式来显示您的值,而不必询问数字是否已被舍入。
(2)如果您正在使用字符串,则ActiveRecord没有理由截断您的输入。这将是许多应用程序将遭受的可怕错误。更有可能发生另一次转换,可能是value.to_f.to_s
或类似的转换。您可以通过仅插入字符来测试它。如果您的值在数据库中以零或零结束,那么您肯定有隐藏的转换。
(3)如果您使用的是小数,即BigDecimal
,请确保您仅使用BigDecimal
而不是Float
!明确地或使用to_f
。这样你也会引入舍入问题
(4)您的数据也可能无法完整地访问您的应用程序,可能是因为Javascript或HTML5输入(type=number
)可能会降低精度。您可以通过在控制器操作中打印出整个params
哈希来验证这一点。 (使用pp
或更好ap
)
(5)检查您的迁移。确保使用正确的精度并将给定的精度应用于数据库。