Не удается получить ожидаемые результаты с помощью pow() в C++

Я делаю домашнее задание для своего класса C++ и пытаюсь сделать то, что я считаю довольно простой математической функцией, но я нахожусь в тупике, потому что она не возвращает то, что я ожидаю вернуть. По сути, это просто проблема с APR, и я пытаюсь конвертировать APR в месячные проценты. Мой инструктор дал нам эту формулу для расчета:

  • monthInterest = ((APR / 100) + 1)^(1/12)

Так что это код, который я использую. Я отделил yearInterest от подсчета monthInterest, потому что следил за тем, чтобы не сделать простой ошибки:

double balance, payment, APR;
cin >> balance >> payment >> APR;
const double yearlyInterest = (APR / 100) + 1;
const double monthlyInterest = pow(yearlyInterest, 1/12)

Используя входы 1000, 100 и 19,9, я получаю результаты в своем физическом калькуляторе и ожидаю:

  1. Ежегодный интерес ~1.19
  2. ежемесячный интерес ~1.015...

Но результат, который дает мне отладчик:

  1. Ежегодный интерес ~1.19
  2. monthInterest = 1

В общем, я спрашиваю, почему мой ежемесячный интерес неправильный? Я не верю, что это проблема типа, потому что pow() выдаст double. Кроме того, я не думаю, что десятичное число должно выходить за пределы двойного типа, оно не так уж велико, и в любом случае мне нужна лишь несколько цифр точности. Так что, если кто-то может помочь мне определить ошибку, которую я сделал, я был бы признателен.

Sidenote: я включил следующее. Я использую вместо того, потому что это то, что я узнал. Если это проблема, я могу ее изменить.

#include <iostream>
#include <cmath>

5 ответов

Решение

В этой строке:

const double monthlyInterest = pow(yearlyInterest, 1/12)

1/12 округляется до 0 (потому что это целочисленное деление) и результат 1, Заменить:

const double monthlyInterest = pow(yearlyInterest, 1.0/12)

Следите за .,

1/12 а также APR выполняем целочисленное деление.

Если вы явно используете числа с плавающей запятой, вы получите ожидаемые результаты.

Вместо 1/12 использование 1/12. (обратите внимание на десятичную точку)

и вместо APR/100 использование APR/100. (обратите внимание на десятичную точку)

Одно ясно, и это то, что 1/12 == 0 (попробуйте 1./12).

Опасность, Уилл Робинсон! 1/12 это не то же самое, что 1.0/12.0,

Вы должны сделать выражение 1/12 вернуть значение с плавающей запятой, чтобы форсировать деление с плавающей запятой вместо целочисленного деления.

менять:

const double monthlyInterest = pow(yearlyInterest, 1/12);

чтобы:

const double monthlyInterest = pow(yearlyInterest, 1.0/12);

const double monthlyInterest = pow(yearlyInterest, 1/12);

целочисленное деление 1/12 сокращает дробный результат до 0, Таким образом, приведенная выше строка будет обработана как

const double monthlyInterest = pow(yearlyInterest, 0);

а число, возведенное в степень 0, равно 1. Таким образом, в вашем случае месячному интересу присваивается значение 1.

Другие вопросы по тегам