首页 > 解决方案 > Ruby .round() 函数对值进行四舍五入,但仅将原始值存储在数据库中

问题描述

我正在尝试将我得到的金额四舍五入到小数点后 2 位。我将金额属性作为小数字段,精度为 32,小数位数为 16。

我试过做 amount.round(2)

def amount(amt)
  amt.to_f.round(2)
end

比方说amt = 80500.00999999999。在 rails 日志中打印时,我得到80500.01. 但是保存时,它保存80500.00999999999在数据库中。我还注意到,如果我这样做65535.00999(或更小的值),它会四舍五入并正确保存到 65535.01。另一方面,如果我使用amount= 65536.00999(或更大的值),它会将金额保存在数据库中而不进行四舍五入。我特别采用了这些数字,因为它是Postgres65535中 unsigned 的上限,并且不知何故得到了这些结果。smallInt

编辑:

我有一个交易模型,它有一个名为金额的属性。我有另一个文件:

# app/operations/txn.rb

def create_txn
  @transaction = Transaction.new(transaction_params)
  @transaction.save
end

def transaction_params
{
  .
  .
  .
  amount: dest_amount,
  .
  .
  .
}
end

def dest_amount
  #logic
end

标签: ruby-on-railsrubypostgresqlruby-on-rails-5rounding

解决方案


我建议您将以下设置器作为amount模型内部 db 属性的实例方法,

def amount=(amt)
  super(amt.to_f.round(2))
end

它将根据您的需要在您的数据库中保存更新的金额值。


推荐阅读