【问题标题】:My decimal numbers get shortened when creating them but not when editing我的十进制数字在创建时会缩短,但在编辑时不会缩短
【发布时间】:2013-10-24 07:38:36
【问题描述】:

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

但是,即使页面上的纬度/经度字段填充了整个数字(即37.7956059460017130.794677734375),当我检查日志时,这些是插入的数字:37.81813830.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 %>

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

【问题讨论】:

    标签: mysql ruby-on-rails activerecord numbers ruby-on-rails-4


    【解决方案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) 检查您的迁移。确保使用正确的精度,并且将给定的精度应用于数据库。

    【讨论】:

    • 感谢您抽出宝贵时间提供帮助! (1) 我不仅在控制台中检查过,在数据库中也检查过,结果是一样的。我创建了一个包含 44.85145543217645 的新项目,然后使用 &lt;%= number_with_precision(@item.latitude, :precision =&gt; 14) %&gt; 显示它,但我得到了 44.85378840000000(2) 我的整个项目中没有任何转换。(3) 我只使用了十进制。
    • 如果你使用字符串并输入“asdf”会发生什么?它是如何存储在数据库中的?
    • 好吧,至少你可以确定,它不是 ActiveRecord。之前一定发生过某些事情,它会修改您的数据。抱歉,我没有主意。
    • 添加了另一件事:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2023-03-28
    • 2017-04-12
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多