Ruby on Rails的 - 的BigDecimal计算错误
问题描述:
首先,在数据库表中的列是与DECIMAL
的10,4
的长度。Ruby on Rails的 - 的BigDecimal计算错误
如果我这样做是在控制台上,甚至在控制器,结果是正确的:
rate = (1/0.7126) * 1.0883
,但如果我这样做,这是行不通的:
rate = (1/from_rate) * to_rate
结果简直就是to_rate
的价值。
from_rate
和to_rate
是数据库查询的结果和值是正确的,如果我登录使用.class
结果是BigDecimal
类的,所以我不知道为什么按预期这一计算不工作。
我试过明确转换使用to_d
和BigDecimal.new
但他们似乎没有什么区别。
答
从证据,它看起来像整数除法实例方法(通过/
援引作为(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
有趣的问题......它看起来像整数除法方法输出一个整数当参数是BigDecimal?适用于Float,但不适用于BigDecimal?试试这个...'rate =(1.0/from_rate)* to_rate' ...它可能是浮点除法方法来处理它。 – SteveTurczyn
谢谢@SteveTurczyn,我的意思是在发布之前尝试类似的东西。它恐怕不起作用,结果也是一样。我能想到的唯一解决方法是将费率乘以1,000以使它们成为整数,但我宁愿不这样做。 – martincarlin87
如果你做'(1/from_rate)',控制器的结果是什么?那是返回'1'整数吗?如果使用'from_rate.to_f'或'(0 + from_rate)',会发生什么?我想确认,该司部分返回1,看看如果这是有关的格式'from_rate' – SteveTurczyn