Ruby on rails Ruby/Rails while循环未正确断开?
我正在一个客户的网站上工作,我正在用RubyonRails编写一个摊销计划计算器。对于较长的贷款期限计算,当余额达到0时,它似乎不会被打破 这是我的密码:Ruby on rails Ruby/Rails while循环未正确断开?,ruby-on-rails,Ruby On Rails,我正在一个客户的网站上工作,我正在用RubyonRails编写一个摊销计划计算器。对于较长的贷款期限计算,当余额达到0时,它似乎不会被打破 这是我的密码: def calculate_amortization_results p = params[:price].to_i i = params[:rate].to_d l = params[:term].to_i j = i/(12*100) n = l * 12 m = p * (j / (1 -
def calculate_amortization_results
p = params[:price].to_i
i = params[:rate].to_d
l = params[:term].to_i
j = i/(12*100)
n = l * 12
m = p * (j / (1 - (1 + j) ** (-1 * n)))
@loanAmount = p
@rateAmount = i
@monthlyAmount = m
@amort = []
@interestAmount = 0
while p > 0
line = Hash.new
h = p*j
c = m-h
p = p-c
line["interest"] = h
line["principal"] = c
if p <= 0
line["balance"] = 0
else
line["balance"] = p
end
line["payment"] = h+c
@amort.push(line)
@interestAmount += h
end
end
我看到的是,在最终付款余额中,它显示“-$-inf”,而不是$0.00,它又重复了一个循环,然后显示$0.00,但利息显示“-$-inf”。它应该循环直到p达到0,然后停止并将平衡设置为0,但它不是。知道我做错了什么吗
这个计算器是。它在短期内(如5年)似乎可以正常工作,但长期会导致上述错误
编辑:
将while循环更改为n.times do
然后将“平衡”视图更改为
= number_to_currency(a["balance"], :unit => "$", :negative_format => "$0.00")
是一种解决方法,但我想知道为什么while循环不能正常工作我认为它与浮点运算精度有关。这里已经讨论过了:出于财务目的,最好使用十进制格式
答案可能是计算循环中的数字,但需要预先计算迭代次数,从头开始。我认为这与浮点运算的精度有关。这里已经讨论过了:出于财务目的,最好使用十进制格式
答案可能是计算循环中的数字,但是使用预先计算的迭代次数,从头开始计算。在Ruby中,数值的默认值是Fixnum。。。e、 g:
> 15 / 4
=> 3
如果尝试使用Fixnum值并将其除以,您将看到奇怪的舍入错误
要确保使用浮点,计算中至少需要有一个数字是浮点
> 15.0 / 4
=> 3.75
> 15 / 4.0
=> 3.75
您对0进行两次比较,如果您确保p是一个浮点,那么这应该是可以的
正如另一个答案所建议的,您应该在数据库中使用“decimal”类型来表示货币
请尝试此操作是否有效:
def calculate_amortization_results
p = params[:price].to_f # instead of to_i
i = params[:rate].to_f # <-- what is to_d ? use to_f
l = params[:term].to_i
j = i/(12*100.0) # instead of 100
n = l * 12
m = p * (j / (1 - (1 + j) ** (-1 * n))) # division by zero if i==0 ==> j==0
@loanAmount = p
@rateAmount = i
@monthlyAmount = m
@amort = []
@interestAmount = 0.0 # instead of 0
while p > 0
line = Hash.new
h = p*j
c = m-h
p = p-c
line["interest"] = h
line["principal"] = c
if p <= 0
line["balance"] = 0
else
line["balance"] = p
end
line["payment"] = h+c
@amort.push(line)
@interestAmount += h
end
end
这等于:
m = (p * j) + (p * j) / ((1 + j) ** n) - 1.0)
等于:(使用这个)
在Ruby中,数值的默认值是Fixnum。。。e、 g:
> 15 / 4
=> 3
如果尝试使用Fixnum值并将其除以,您将看到奇怪的舍入错误
要确保使用浮点,计算中至少需要有一个数字是浮点
> 15.0 / 4
=> 3.75
> 15 / 4.0
=> 3.75
您对0进行两次比较,如果您确保p是一个浮点,那么这应该是可以的
正如另一个答案所建议的,您应该在数据库中使用“decimal”类型来表示货币
请尝试此操作是否有效:
def calculate_amortization_results
p = params[:price].to_f # instead of to_i
i = params[:rate].to_f # <-- what is to_d ? use to_f
l = params[:term].to_i
j = i/(12*100.0) # instead of 100
n = l * 12
m = p * (j / (1 - (1 + j) ** (-1 * n))) # division by zero if i==0 ==> j==0
@loanAmount = p
@rateAmount = i
@monthlyAmount = m
@amort = []
@interestAmount = 0.0 # instead of 0
while p > 0
line = Hash.new
h = p*j
c = m-h
p = p-c
line["interest"] = h
line["principal"] = c
if p <= 0
line["balance"] = 0
else
line["balance"] = p
end
line["payment"] = h+c
@amort.push(line)
@interestAmount += h
end
end
这等于:
m = (p * j) + (p * j) / ((1 + j) ** n) - 1.0)
等于:(使用这个)