Ruby on rails Ruby/Rails while循环未正确断开?

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 -

我正在一个客户的网站上工作,我正在用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 - (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)
等于:(使用这个)