Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 函数的作用是:对值进行舍入,但只将原始值存储在数据库中_Ruby On Rails_Ruby_Postgresql_Ruby On Rails 5_Rounding - Fatal编程技术网

Ruby on rails 函数的作用是:对值进行舍入,但只将原始值存储在数据库中

Ruby on rails 函数的作用是:对值进行舍入,但只将原始值存储在数据库中,ruby-on-rails,ruby,postgresql,ruby-on-rails-5,rounding,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 5,Rounding,我正试图把我得到的金额四舍五入到小数点后两位。我将amount属性作为精度为32、刻度为16的十进制字段 我试过做数量。第二轮 def金额(金额) 四舍五入金额(2) 结束 比如说amt=80500.0099999999。在rails日志中打印时,我得到了80500.01。但在保存时,它会将80500.0099999999保存到数据库中。 此外,我还注意到,如果我使用65535.00999(或更小的值),则其舍入并正确保存为65535.01。另一方面,如果am使用的是金额=65536.0099

我正试图把我得到的金额四舍五入到小数点后两位。我将amount属性作为精度为32、刻度为16的十进制字段

我试过做数量。第二轮

def金额(金额)
四舍五入金额(2)
结束
比如说
amt=80500.0099999999
。在rails日志中打印时,我得到了
80500.01
。但在保存时,它会将
80500.0099999999
保存到数据库中。 此外,我还注意到,如果我使用
65535.00999
(或更小的值),则其舍入并正确保存为65535.01。另一方面,如果am使用的是
金额=65536.00999
(或更大的值),则会将金额保存为数据库中的金额,而不进行舍入。我特别考虑了这些数字,因为
65535
是Postgres中无符号
smallInt
的上限,不知何故我得到了这些结果

编辑:

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

#app/operations/txn.rb
def创建_txn
@事务=事务。新建(事务参数)
@事务处理.save
结束
def事务参数
{
.
.
.
金额:目的地金额,
.
.
.
}
结束
def目的地金额
#逻辑
结束

我建议您将以下setter作为db attribute
amount
的实例方法放在模型内部

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

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

解决此问题的常用方法是将美分存储为整数,而不是将美元存储为浮点数


您可以将所有内容计算并存储为美分,只需将其除以100.0即可转换为美元进行显示。

您的问题是什么?浮点值
80500.01
是一个近似值。它的实际值是
80500.009999999476131051778793334969375
。因此,如果您说它被保存为
80500.0099999999
,似乎是正确的。尝试改用十进制值,即..@Stefan,但如何证明两个数字的两种不同行为是正确的。round()将65535.00999四舍五入到65535.01,但不是65536.00999您能发布控制器操作吗?金额应该在哪里四舍五入并保存?@erumsanwari也许我不理解您的问题。您当前有哪些值(在Ruby/Rails和Postgres中)以及您期望的值是什么?@erumsanwari您的数据库字段和模型名是什么这将导致无休止的循环。您应该使用
super
将值传递给原始设置器
super(amt.to_f.round(2))
@3limin4t0r对你的评论感到惊讶,请详细说明。@ray我已经创建了一个,看一看。我希望这能把事情弄清楚。@3limin4t0r谢谢我可以说是你救了我!我也很抱歉我没有找这个。@erumsanwari:如你所愿。不过,对于数千个金融应用程序来说,它已经过测试,证明是比浮动更好的解决方案。