红宝石中的数学计算

时间:2011-11-07 00:51:24

标签: ruby math

我有一个计算贷款摊销时间表的标准公式。

这是公式:

(Px(i/12))/(1-(1+i/12)^-n)

以下是我在ruby中的内容:

p = BigDecimal('1000.0')
n = BigDecimal('12')
i = BigDecimal('3')

m = (p * (i/12))/(1-(1+i/12) ** -n)

我收到以下错误:在'**'中:错误的参数类型BigDecimal(预期的Fixnum)(TypeError)

我很难尝试在红宝石中使用Fixnun,Float和BigDecimal。

2 个答案:

答案 0 :(得分:2)

如果你想使用**又名BigDecimal#power(n)

n必须是每个定义的整数

PS:我刚刚在wikipedia上查找了你的公式。由于n是付款的数量,因此它本质上是一个整数,因此只需使用Fixnum为n - 您不会遇到任何麻烦:)

答案 1 :(得分:0)

使用浮动:

>> p = 1000.0
=> 1000.0
>> n = 12.0
=> 12.0
>> i = 3.0
=> 3.0
>> (p*(i/12))/(1-(1+i/12)**-n)
=> 268.447577024146

使用BigDecimal:

>> p = BigDecimal('1000.0')
=> #<BigDecimal:1082c4760,'0.1E4',4(12)>
>> n = BigDecimal('12')
=> #<BigDecimal:1082c14c0,'0.12E2',4(8)>
>> i = BigDecimal('3')
=> #<BigDecimal:1082be2e8,'0.3E1',4(8)>
>> m = (p * (i/12))/(1-(1+i/12) ** -n.to_i)
=> #<BigDecimal:1082b4950,'0.2684475770 2414639639 7495957671 887300036E3',40(48)>
>> m.to_i
=> 268

似乎BigDecimal **只需要一个FixNum作为动力部分...... 通过将.0放在数字的末尾,它们将全部放入浮点数。适合我。