Не удается получить ожидаемые результаты с помощью 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.19
- ежемесячный интерес ~1.015...
Но результат, который дает мне отладчик:
- Ежегодный интерес ~1.19
- 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
это не то же самое, что 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.