Ruby on Rails的 - 的BigDecimal计算错误

问题描述:

首先,在数据库表中的列是与DECIMAL10,4的长度。Ruby on Rails的 - 的BigDecimal计算错误

如果我这样做是在控制台上,甚至在控制器,结果是正确的:

rate = (1/0.7126) * 1.0883 

,但如果我这样做,这是行不通的:

rate = (1/from_rate) * to_rate 

结果简直就是to_rate的价值。

from_rateto_rate是数据库查询的结果和值是正确的,如果我登录使用.class结果是BigDecimal类的,所以我不知道为什么按预期这一计算不工作。

我试过明确转换使用to_dBigDecimal.new但他们似乎没有什么区别。

+1

有趣的问题......它看起来像整数除法方法输出一个整数当参数是BigDecimal?适用于Float,但不适用于BigDecimal?试试这个...'rate =(1.0/from_rate)* to_rate' ...它可能是浮点除法方法来处理它。 – SteveTurczyn

+0

谢谢@SteveTurczyn,我的意思是在发布之前尝试类似的东西。它恐怕不起作用,结果也是一样。我能想到的唯一解决方法是将费率乘以1,000以使它们成为整数,但我宁愿不这样做。 – martincarlin87

+0

如果你做'(1/from_rate)',控制器的结果是什么?那是返回'1'整数吗?如果使用'from_rate.to_f'或'(0 + from_rate)',会发生什么?我想确认,该司部分返回1,看看如果这是有关的格式'from_rate' – SteveTurczyn

从证据,它看起来像整数除法实例方法(通过/援引作为(1/from_rate)当参数(除数)为BigDecimal的,所以在这种情况下,它返回整数值1返回一个整数的结果。这ISN”如果参数是一个浮点数,就会出现问题,因为在这种情况下,整数除法返回浮点数。

您可以通过仅使用浮点除数来规避此问题...通过指定1.0(浮点数)作为分红

rate = (1.0/from_rate) * to_rate 

or alternat您可以将from_rate值转换为浮点数。

rate = (1/from_rate.to_f) * to_rate