C :利率不会显示为.06,.6,等
C++: Interest Rate will not Display as .06, .6, etc
我创建了下面的程序进行分配。您应该可以输入原始本金,最低利率,最高利率和积累利息的年数。
测试它后,一切正常,除非我输入最大的兴趣为.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;
}
好吧, double
不能准确地表示十进制值:它是二进制浮点,即其内部表示为_(-1)> sign * 显着 * 2 exponent 其中 sign 是0或1,显着无符号整数, exponent 一个签名的整数。这是一个相对简单的参数,表明您无法确切地表示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
。不过,它看起来不会漂亮。
现在,对于如何处理此类问题的有趣问题?用十进制数字计算时的一般解决方案是使用小数浮点,但仅在提议将其添加到C 标准库中。您可以准确维持利率。对于您的特定设置,最简单的方法可能是不使用利率来控制循环的执行,而是使用合适的计数器。
关于浮点毫无准确的答案是正确的,这是您在谈话时不使用浮点号的原因。
一个快速的黑客,可以让您几乎没有修改的工作将是更改:
for (double rate = minimumInterest; rate <= maximumInterest; rate += .01)
to:
for (double rate = minimumInterest; rate <= (maximumInterest+0.001); rate += .01)
它将起作用。无论如何,您的金钱计算在某个时候都是错误的。
正确的实现将使用固定点算术。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 密码登录程序将永远循环并显示不正确的结果
- C :利率不会显示为.06,.6,等