ruby-on-rails - 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
解决方案
我建议您将以下设置器作为amount
模型内部 db 属性的实例方法,
def amount=(amt)
super(amt.to_f.round(2))
end
它将根据您的需要在您的数据库中保存更新的金额值。
推荐阅读
- html - 为什么我不能显示背景图片?
- java - java中.equals()方法的假设——比较对象的实例或对象的状态
- css - 如何更改数据表列过滤器(日历)的宽度?
- vba - 将数据从用户表单复制到工作表以获取多项数据
- r - 使用因子向量重新排序数据框
- timezone - Salt如何处理不同的时区?
- c++ - 为什么当 int = 0 时 while(int) 结束?
- php - array_merge 返回的空数组将一个空数组与一个填充数组合并
- android - 如何找到导致我的应用程序每次点击越来越慢的原因?
- ios - 无法将“STPPaymentMethodCardParams”类型的值分配给“STPCardParams”类型