我很确定我是以正确的方式做到这一点,但显然我并非如此。这个while循环一旦达到0就会无限运行。它会一直输出"每月付款:$ 0.00"和#34;您支付的贷款是:0.00美元"一遍又一遍地。我做错了什么?
while (loan_balance ! = 0)
{
monthly_payment = loan_balance / 20;
loan_balance = loan_balance - monthly_payment;
cout << "Monthly Payment: $" << monthly_payment << ends;
cout << "Your loan balance after that payment is: $" << loan_balance << endl;
}
答案 0 :(得分:4)
如果load_balance
是浮点类型(float
或double
),那么load_balance != 0
(其中0
为0.0f
)可能会除非明确设置为load_balance = 0.0f
,否则永远不会为假。因此,应将其与较小的阈值进行比较,例如
while(load_balance >= 1e-4)
同样不等的运算符是!=
,空格! =
不起作用。
答案 1 :(得分:0)
loan_balance可能是浮动或双倍;它可能会减少到接近但不是很接近0.将您的比较改为&#34;&gt; 0&#34;
答案 2 :(得分:0)
0 是int
0.0f 是double
或float
所以你要说
while(loan_balance != 0)
do stuff
作为回报的编译器说:&#34; loan_balance
永远不会 永远 0 如果它是双/漂浮,所以我只是继续做东西。&#34;
请记住:整数不是浮动/双打
答案 3 :(得分:0)
您的loan_balance很可能永远不会真正为0。我很确定你想把你的loan_balance浮动或加倍。
double loan_balance=23000.00;
while (loan_balance >0.000)
{
monthly_payment = loan_balance / 20.0;
loan_balance = loan_balance - monthly_payment;
cout << "Monthly Payment: $" << monthly_payment << ends;
cout << "Your loan balance after that payment is: $" << loan_balance << endl;
}
答案 4 :(得分:0)
你面临着精确和舍入的问题。
当指数减少数字时,它将收敛为零。如果它是一个有限精度的浮点数,那么将有一个很小的数字,无法通过任何可能的表示与零区分开来。所以,像
这样的循环double d=1.0; // or some other finite value
while(d!=0.0)
d*=ratio; // ratio is some finite value so that fabs(ratio)<1.0
将以有限的迭代次数完成。
但是,取决于d
和ratio
的值,尤其是当d
在次正常范围内接近零时(意味着较少的有效位)并且fabs(ratio)
接近1.0(慢收敛),选定的舍入模式可以使d*ratio
向d
舍入。当发生这种情况时,上面的循环永远不会结束。
在支持IEC 60559的机器/编译器中,您应该能够使用fegetround()
和fesetround()
(在<fenv.h>
中声明)测试和设置浮点舍入模式。您系统上的默认舍入可能是最近的。为了使上面的循环更快地收敛(或根本不收敛),最好使舍入为0。
但请注意,它有一个价格:根据应用的不同,改变圆角模式可能是不可取的,因为精度/准确度(OTOH,如果你已经在低于正常范围工作,你的精度可能不是那么好无论如何)。
但原始问题的收敛问题仍然有点复杂,因为它是通过两步操作完成的。因此在除法运算中有一个舍入,在减法运算中有另一个舍入。为了增加收敛的机会和速度,减法应尽可能多地取loan_balance
的值,因此在这种情况下,可能四舍五入会更好。事实上,当我将fesetround(FP_UPWARD)
添加到OP的原始代码(同时定义loan_balance
到1.0
的初始值)时,它会在14466次迭代后收敛。 (请注意,这只是猜测,对原始代码的影响可能只是一个特殊情况。需要进行更深入的分析才能对其进行鉴定,这样的分析会必须考虑不同的比率值,以及minuend和subtrahend的相对优势。)