Rails 3.如何在模型中将数字显式舍入到小数点后两位?

可能重复:
Rails 3.如何以编辑forms显示两位小数?

我知道我可以使用sprintf来限制小数点后两位。

当我在表格中或表格中重新显示价格时,有时我会得到80而不是80.00。 从数据库中输入价格的那一刻起,只用两位小数存储价格会不会更好? 这样,无论何时显示,它总是会显示两位小数。 如果是这样,怎么样?

您应该尝试使用:decimal类型的数据库字段,其中:scale设置为2

将十进制列添加到新表中;

 create_table :my_table do |t| t.decimal :my_column, :scale => 2 end 

要将列添加到现有表;

 add_column :my_table, :my_column, :decimal, :scale => 2 

由于某些数据库没有精确默认值,因此精度很高。 比如postgresql:

  add_column :my_table, my_column, precision: 30, scale: 2 

您可以在显示数字时简单地使用x.round(2) – 它将始终显示两位小数。 通常建议在后端数据库中将价格存储为整数,因为当您需要非常高的精度时,它们会得到更好的处理。 在这种情况下,你可以选择任何一种方式。

如果它是:float:decimal ,则Ruby中的8080.00将是相同的( 80.0000 )。 后者没有“存储”更多小数位,并且尾随零只在视图中有意义。 你可以像你说的那样使用sprintf ,或者你可以使用Rails的方便的number_with_precision帮助器:

 <%= number_with_precision price, :precision => 2 %> 

顺便提一下,这是关于这个主题的另一个问题 。 @Matthew Rudy对一件事是正确的:对于你应该使用的金钱栏:decimal

如果你真的致力于在你的视图中没有这个,你可以使用像Draper这样的东西将装饰器应用到你的属性中( number_with_precision会将你的number_with_precision调用移到一个新的Decorator类中),但它可能有点过分在这种情况下。

为此,我使用number_to_currency格式化程序。 由于我在美国,默认设置对我来说很好。

 <% price = 45.9999 %> <%= number_to_currency(price)%> => $45.99 

如果默认值不适合您,您也可以传入选项。 有关api.rubyonrails.org上可用选项的文档