2

我正在尝试制作一个程序,允许用户在考虑贷款时确定不同的方面。第一个等式应该确定在给定贷款金额、利率和月数的情况下每月支付的金额。第二个等式应该确定在给定贷款金额、利率和每月还款额的情况下,一个人必须支付多少笔款项(或几个月)。这是我正在测试的代码,但我似乎无法获得有效的输出。

    float amount = 20000;
    float rate = (float) 7.5;
    float months = 60;
    float payment = 450;

    float answer = (float) (((amount*(rate/1200))*(1+(Math.pow((rate/1200), months))))/((1+Math.pow((rate/1200), months))-1));
    System.out.println(answer);

    float answer2 = (log(payment/amount)-log((payment/amount)-(rate/1200)))/(log(1+(rate/1200)));
    System.out.println(answer2);

对于第一个等式,我首先不断出错,因为它希望答案是双精度,并一直告诉我,对于我的速率变量,我无法从双精度转换为浮点,所以我必须进行强制转换。一旦我消除了错误,我就会不断地寻找答案。

对于第二个等式,它一直说我不能除以零。有没有人知道任何解决方案。在网上看时,好像我的方程式是正确的,所以我不知道如何使它们起作用。

此外,如果有人碰巧知道确定利率的好公式,那将非常有帮助。

4

3 回答 3

3

你错过了一些演员表,log应该是Math.log。当我将所有内容都转换为双精度时(为什么您如此坚持使用浮点数?使用双精度意味着您不需要将这些演员表放在任何地方)我得到以下输出:

无穷
大 52.23012630649508

不确定第二个值应该是什么,但这似乎没问题;没有警告,也没有错误。关于第一部分,你除以零。尝试这个:

System.out.println(Math.pow(rate/1200, months));

你会得到以下微小的数字

5.659799424266714E-133

浮点运算将导致您的分母为零,因为该值 +1 将失去精度,因此:

System.out.println(1+Math.pow(rate/1200, months)-1);

收益率0.0和您的分母将导致第二个结果为无穷大。

于 2011-09-19T13:21:18.657 回答
2

您不应该使用浮点/双精度或原始整数作为货币值,而是使用 BigDecimal:http: //download.oracle.com/javase/1.4.2/docs/api/java/math/BigDecimal.html

这使得没有必要强制执行 double->float 强制转换,我希望错误消失。如果没有,请在您的新代码中添加评论。

于 2011-09-19T13:17:17.833 回答
0

对于第二个方程:

float answer2 = (log(payment/amount)-log((payment/amount)-(rate/1200)))/(log(1+(rate/1200)));

唯一可能的除零是 if log(1+(rate/1200))equals 0。如果(rate/1200)返回,这是可能的0。您可以通过(rate/1200)将这两种情况转换为浮点数来解决此问题。

因此:

float answer2 = (log(payment/amount)-log((payment/amount)-((float)(rate/1200))))/(log(1+((float)(rate/1200))));

我认为错误在于rate/1200总是0因为1200是整数,除法的解也是如此。

于 2011-09-19T13:17:23.183 回答