Я работаю на сайте клиента и пишу калькулятор графика амортизации в рубине на рельсах.Для более длинных расчетов по ссуде он, кажется, не нарушается, когда баланс достигает 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 - (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
А вот представление:
- @amort.each_with_index do |a, i|
%li
.m
= i+1
.i
= number_to_currency(a["interest"], :unit => "$")
.p
= number_to_currency(a["principal"], :unit => "$")
.pp
= number_to_currency(a["payment"], :unit => "$")
.b
= number_to_currency(a["balance"], :unit => "$")
То, что я вижу, вместо конечного платежного баланса, равного 0,00 долл. США, показывает «- $ - inf», повторяет еще один цикл, затем отображает 0,00 долл., Но показывает «- $ - inf» для интереса.Он должен зацикливаться до тех пор, пока p не достигнет 0, затем остановится и установит баланс как 0, но это не так.Есть идеи, что я сделал не так?
Калькулятор здесь .Кажется, что он хорошо работает для более коротких сроков, например, 5 лет, но более длительные сроки вызывают вышеуказанную ошибку.
Редактировать:
Изменение цикла while на n.times do
изатем изменение вида баланса на
= number_to_currency(a["balance"], :unit => "$", :negative_format => "$0.00")
Обходной путь, но я хотел бы знать, почему цикл while не будет работать правильно