我创建了以下程序以进行分配。您应该能够输入原始本金,最低利率,最高利率以及累积利息的年数。
经过测试后,一切正常,除非我输入我的最大兴趣为.06,.6等。出于某种原因,它不会显示最大的兴趣。如果我输入.06作为最低利息,它会成功显示,如果我使用的最高利息金额高于.06,则会显示.06金额。没有其他金额可以解决我的问题。
有人能帮助我弄清楚我需要改变什么以纠正这个问题吗?
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
//variables & named constants
int principal = 0;
double minimumInterest = 0.0;
double maximumInterest = 0.0;
int yearBase = 1;
int years = 0;
double balance = 0.0;
//inputs
cout << "Enter the beginning principal: $";
cin >> principal;
cout << "Enter the minimum interest rate: ";
cin >> minimumInterest;
cout << "Enter the maximum interest rate: ";
cin >> maximumInterest;
cout << "Enter the number of years the interest will accumlate: ";
cin >> years;
//calculations & loop
do
{
cout << "Year " << yearBase << ":" << endl;
for (double rate = minimumInterest; rate <= maximumInterest; rate += .01)
{
balance = principal * pow(1 + rate, yearBase);
//display rate with zero decimal places
cout << fixed << setprecision(0);
cout << " Rate " << rate * 100 << "%: $";
//display balance with two decimal places
cout << setprecision(2) << balance << endl;
}
//update years counter
yearBase +=1;
} while (yearBase <= years);
system("pause");
return 0;
}
答案 0 :(得分:1)
好吧,double
并不完全代表十进制值:它是一个二进制浮点,即它的内部表示是_( - 1) sign * 重要 * 2 exponent 其中 sign 为0或1,显着无符号整数,指数有符号整数。这是一个相对简单的论证,表明你不能完全代表0.01或0.6。也就是说,增加0.01六十次的计算可能不是0.6。实际上,如果您使用足够的数字打印这些值,您可以看到效果:
#include <iostream>
#include <iomanip>
#include <limits>
int main()
{
double sum;
double small(0.01);
double big(0.6);
for (int i(0); i != 60; ++i) {
sum += small;
}
std::cout << std::setprecision(std::numeric_limits<double>::digits10 + 4)
<< "small=" << small << "\n"
<< "big=" << big << "\n"
<< "sum=" << sum << "\n";
}
运行此程序将产生如下内容:
small=0.01000000000000000021
big=0.5999999999999999778
sum=0.6000000000000003109
如果要查看计算所使用的确切值,则需要将精度设置为std::numeric_limits<double>::digits
。但它看起来并不漂亮。
现在有关如何处理这类问题的有趣问题?使用十进制数计算时的一般解决方案是使用十进制浮点数,但只有在being proposed的过程中才能添加到C ++标准库中。你可以准确地维持利率。对于您的特定设置,最简单的方法可能是不使用利率来控制循环的执行,而是使用合适的计数器。
答案 1 :(得分:1)
关于浮点不准确性的答案是正确的,这也是你说话时不使用浮点数的原因。
快速破解可以让你稍加修改就可以改变:
for (double rate = minimumInterest; rate <= maximumInterest; rate += .01)
为:
for (double rate = minimumInterest; rate <= (maximumInterest+0.001); rate += .01)
它会起作用。无论如何,你的钱计算在某些时候都是错误的。
正确的实现将使用定点算法。