【问题标题】:Ruby BigDecimal : increase number of initial digits saved in databaseRuby BigDecimal:增加保存在数据库中的初始位数
【发布时间】:2015-06-16 14:57:06
【问题描述】:

我在 Rails 4 应用程序上遇到了Ruby BigDecimal 的问题。

我在事物模型中有一个“价格”属性,该类是 BigDecimal。每当我创建或更新事物时,我都希望使用严格的两位十进制数字保存“价格”属性(例如“0.00”、“10.00”、“10.10”、“10.01”)。

但默认情况下,如果不需要两位,它只会保存一位十进制数字。这是我插入的内容和当前保存的内容:

"0" => "0.0" (instead of "0.00")
"10" => "10.0" (instead of "10.00")
"10.1" => "10.1" (instead of "10.10")
"10.01" => "10.01" (OK)

我不只是想用两位小数显示“价格”属性(可以使用"%.2f" % price 完成),我想在我的数据库中保存两位小数的“价格”属性。有什么办法吗?

非常感谢您的帮助。

【问题讨论】:

  • 我认为您的 DBMS 可能是问题所在,而不是 ruby​​ 或 rails。您使用的是哪个 DBMS? (postgres、mysql、sqlite 等)
  • 你在担心the wrong thing。这是一个显示问题,而不是数据库或数据类型。值是正确的:0.00.0010.010.00,它们只是显示方式不同,因此请正确格式化显示。
  • 但默认情况下,如果不需要两位,它只会保存一位十进制数你是怎么想出来的?
  • 我的 DBMS 是 Postgres。
  • 在 Rails 控制台中,当我创建一个价格为“10”的“t”事物对象,然后通过键入“t.price.to_s”显示它时,我得到“ 10.0"。更多示例可以在原帖中找到。

标签: ruby-on-rails ruby bigdecimal


【解决方案1】:

在我看来,您所描述的内容纯粹是为了展示目的。我不知道有什么方法可以将具有特定数量的小数的小数保存到数据库中,除非您将它们保存为字符串,否则这些小数实际上不会增加​​精度。

在我看来,您最好在 Thing 模型上创建一个方法,该方法将返回您想要的价格格式。

【讨论】:

  • 我确实可以通过"%.2f" % price 来格式化价格显示,但我们不能像这样(两位数)在数据库中保存它吗?目前它会自动保存一位数字,即使它不添加精度值(例如:“10”保存为“10.0”)。
  • 我认为你没有抓住重点。它没有保存为 10.0。它在数据库中保存为浮点数,值为 10。当它进入 ruby​​ 时,它变成值为 10 的浮点数。如果您在控制台或任何其他使用 to_s 的方式中查看它,它将以至少 1 个小数显示(所以你知道它是一个浮点数),但显示值所需的小数最少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多