Как выполнить кредитные уравнения в Java? - PullRequest
2 голосов
/ 19 сентября 2011

Я пытаюсь создать программу, которая позволит пользователю определять различные аспекты при рассмотрении вопроса о кредите. Предполагается, что первое уравнение определяет, какой ежемесячный платеж будет отдан сумме кредита, процентной ставке и числу месяцев. Предполагается, что второе уравнение определяет, сколько платежей (или месяцев) нужно будет сделать, учитывая сумму кредита, процентную ставку и ежемесячный платеж. Это код, с которым я тестирую, но я не могу получить правильный вывод.

    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);

Для первого уравнения я сначала продолжал получать ошибки, потому что он хотел, чтобы ответ был двойным, и продолжал говорить мне, что для моей переменной скорости я не мог конвертировать из двойного в плавающее, поэтому мне пришлось вводить приведение. Как только я получаю ошибки, я получаю бесконечность за ответ.

Во втором уравнении говорится, что я не могу разделить на ноль. Кто-нибудь знает какие-либо решения для этого. Когда я смотрю онлайн, мне кажется, что я правильно сформулировал свои уравнения, поэтому я не знаю, как заставить их работать.

Кроме того, если бы кто-нибудь узнал хорошую формулу для определения процентной ставки, это было бы очень полезно.

Ответы [ 3 ]

3 голосов
/ 19 сентября 2011

Вам не хватает некоторых приведений, и 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, и ваш знаменатель приведет к тому, что второй результат будет бесконечным.

2 голосов
/ 19 сентября 2011

Вы не должны использовать числа с плавающей запятой / двойные или необработанные целые для денежных значений, вместо этого используйте BigDecimal: http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigDecimal.html

Это делает ненужным принудительное приведение типа double-> float, и я надеюсь, что ошибки исчезнут. Если нет, то добавьте комментарий с новым кодом, пожалуйста.

0 голосов
/ 19 сентября 2011

Для второго уравнения:

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

Единственное возможное деление на ноль - это если log(1+(rate/1200)) равно 0. Это возможно, если (rate/1200) возвращает 0. Вы можете решить эту проблему, бросив (rate/1200) в число float для обоих случаев.

Таким образом:

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

Я думаю, что ошибка заключается в том факте, что rate/1200 всегда 0, потому что 1200 является целым числом, как и решение деления.

...