【问题标题】:Storing Prices with Cents in Rails在 Rails 中用美分存储价格
【发布时间】:2015-04-21 12:11:29
【问题描述】:

好的,我有一笔 Stripe 费用,我要向其征税。 Stripe 将一个数字视为美分,因此它会为您留下一个类似 10015 而不是 100.15 的数字。

在我的控制器中,我将号码作为 10015/100.0 发送到 ActiveRecord

当我检索它时,它给了我#<BigDecimal:7fca81f71130,'0.1243E3',18(27)>>

怎么了?

我试过了

rails g migration add_expense_to_user expense:integer

rails g migration add_expense_to_user expense:decimal

我添加了谁的迁移

add_column :user, :expense, :decimal, precision: 6, scale: 2

这是当前设置。

如果存储为 10015/100,我如何存储/检索该值

【问题讨论】:

  • 你说的“花栗鼠胡言乱语”是什么?了解您的问题会很有帮助。
  • @alephtwo 已编辑,反对票的嘘声。
  • 你的问题是什么?
  • @holgerjust 再次编辑
  • 哇,为什么投反对票,天哪

标签: ruby-on-rails activerecord currency stripe-payments


【解决方案1】:

BigDecimal 只是 Rails 用于 DB 中 decimal 类型的类型。 0.1243E3 是科学记数法,是 0.1243 x 10³ 的缩写 - 即。 124.3

您可以通过在 Ruby 中使用.to_f 方法从中获取常规浮点数,或者您可以将BigDecimal 传递给其他Rails 助手,例如number_to_currency(the_big_decimal) 将产生"$124.30"

因此,换句话说,使用 BigDecimal,您可能已经拥有了您在这个问题中所要求的内容。

【讨论】:

    【解决方案2】:

    访问数据时,需要拨打.to_f

    在 irb 中:

    a = BigDecimal.new(5, 2)
    a
    => #<BigDecimal:1ad7c98,'0.5E1',9(27)> 
    a.to_f
    => 5.0
    

    【讨论】:

      【解决方案3】:

      值以任意精度存储在 BigDecimal 对象中。然而,非整数值(即浮点数)的“通用”表示不提供这种精度。因此,BigDecimal 提供了各种选项来将其值转换为其他类型。

      例如,您可以使用 expense.to_f 来获取 BigDecimal 值的浮点表示(因此会一直丢失精度)。或者,如果您只想打印值,可以使用to_s 方法之一将值格式化为字符串:

      expense.to_s
      # => "124.3"
      

      详情请参阅BigDecimal documentation

      【讨论】:

      • 系统失去这样的精度不是不可避免的吗?除非所有费用都向同一个客户收取,在这种情况下,您可以算出,从小数点后 3 位四舍五入时,您一定会输钱或偷钱吗? @holgerjust
      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2013-09-26
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多