написание кода для времени, чтобы удвоить годовую процентную ставку - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь написать код для годовой процентной ставки, который позволит вам ввести любую сумму, и он покажет вам, сколько примерно лет потребуется, чтобы ваши деньги как минимум удвоились.Данная процентная ставка составляет 5% годовых.Дело в том, что он не работает должным образом и показывает абсурдно высокие цифры, например, около 200 лет.

#include <iostream>
using namespace std;

int main() {
    int deposit;
    int counter;

    cout << "Deposit an amount NO LESS than 1000." << endl;
    cin >> deposit;

    for (deposit ;; deposit = 1.05 * deposit) {
        counter = counter+1;

        if (deposit >= 2 * deposit) {
            cout << endl;
            cout << "Your money will double in "<< counter <<" years." << endl;
            break;
        }
    }   
}

Ответы [ 5 ]

0 голосов
/ 09 октября 2018

Вместо использования цикла вы можете рассчитать время, необходимое для удвоения денег напрямую.

Сумма денег не интересна, поэтому вам не нужно хранить сумму денег.Интересна только норма прибыли.

Вы можете рассчитать ее непосредственно как log(2) / log(r), где r - норма прибыли.Например, log(2) / log(1.05) дает точное время для удвоения первоначальной суммы денег с возвратом 5%.

Включите стандартный заголовок <cmath>, чтобы получить std::log().

#include <iostream>
#include <cmath>

int main() {
  double yearsToDouble = std::log(2) / std::log(1.05);
  std::cout << "Your money will double in "<< yearsToDouble << " years." << std::endl;
}  
0 голосов
/ 09 октября 2018

Чтобы добавить к другим ответам, которые в значительной степени правильно указывают на то, что deposit > 2*deposit никогда не может быть истинным (вам нужна вторая переменная, чтобы записать начальное значение!), Единственная причина, по которой ваш цикл завершается вообще, заключается в том, что deposit становится настолько большим , что 2*deposit "оборачивается" из-за переполнения.

Похоже, что 2*deposit больше deposit (логически невозможно - вам нужно это исправитьсравнение!) хотя, строго говоря, результаты не определены.

Очевидно, что это происходит с вами после примерно 200 итераций.

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

Я бырекомендуем вместо этого подсчитывать целые или десятые доли.Вы можете достичь этого путем умножения входных данных на 100 или 1000. Полученное в результате инкрементальное умножение на 1,05 будет иметь коэффициент округления, но банки тоже будут этим заниматься!

0 голосов
/ 09 октября 2018

Эта строка

if (deposit >= 2 * deposit) {

Не оценивается как true (если deposit не отрицательно или не исключает случай с некоторым краем).Вы, вероятно, хотели сравнить его с начальным значением.Итак, после этого:

cin >> deposit;

Я бы поставил

double initialDeposit = deposit;

, а затем изменил другую строку на

if (deposit >= 2 * initialDeposit) {
0 голосов
/ 09 октября 2018
if (deposit >= 2 * deposit) {
        cout << endl;
        cout << "Your money will double in "<< counter <<" years." << endl;
        break;
    }

В приведенном выше выражении if вы ожидаете, что deposit будет больше или равно 2 times of deposit.Что может быть истинно только в том случае, если значение deposit равно нулю или меньше нуля.

Я предлагаю вам использовать переменную temp, чтобы сохранить входное значение deposit и продолжить.

0 голосов
/ 09 октября 2018

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

for (float initdeposit = deposit;; deposit = 1.05 * deposit)
{
    counter = counter+1;

    if (deposit >= 2 * initdeposit)
    {
        cout << endl;
        cout << "Your money will double in "<< counter <<" years." << endl;
        break;
    }
}   

a.exe

Deposit an amount NO LESS than 1000.
1000

Your money will double in 16 years.

Примечание. Независимо от суммы, время удвоения всегда будет одинаковым.:)

...