编写时间代码使年利率翻倍

Posted

技术标签:

【中文标题】编写时间代码使年利率翻倍【英文标题】:writing a code for time to double annual interest rate 【发布时间】:2019-03-14 00:19:36 【问题描述】:

我正在尝试编写一个年利率代码,让您可以输入任何金额,它会显示大约需要多少年才能使您的资金至少翻倍。给定的利率是每年 5%。问题是,它工作不正常,而且显示的数字高得离谱,比如 200 年左右。

#include <iostream>
using namespace std;

int main() 
    int deposit;
    int counter;

    cout << "Deposit an amount NO LESS than 1000." << endl;
    cin >> deposit;

    for (deposit ;; deposit = 1.05 * deposit) 
        counter = counter+1;

        if (deposit >= 2 * deposit) 
            cout << endl;
            cout << "Your money will double in "<< counter <<" years." << endl;
            break;
        
       

【问题讨论】:

要押金是没有意义的。结果不会改变。 @schorsch312 几乎是真的,如果你有 0 钱,那么取决于你的看法有多积极,它需要 0 或无限的时间才能翻倍;) 如果银行同意您的意见,我会与银行商谈。 既然这看起来像是一个练习,你知道你是否可以使用对数吗?这是最好的解决方案,但如果你只是要练习循环,那就不太合适了。 @Useless nope,我自己做这个,虽然我们目前的课程是关于循环的,所以这就是我的知识范围 【参考方案1】:

您可以直接计算将钱翻倍所用的时间,而不是使用循环。

金额不感兴趣,所以不需要存储金额。有趣的只是回报率。

您可以直接将其计算为log(2) / log(r),其中r 是回报率。例如,log(2) / log(1.05) 为您提供了将初始金额翻倍并获得 5% 回报的确切时间。

包含标准的&lt;cmath&gt; 标头以获取std::log()

#include <iostream>
#include <cmath>

int main() 
  double yearsToDouble = std::log(2) / std::log(1.05);
  std::cout << "Your money will double in "<< yearsToDouble << " years." << std::endl;
  

【讨论】:

Nitpick:C++ 没有导入,也没有包。这包括标准标头cmath 只是检查:这对 compound 利息是否正确? 删除不必要的输入是个好主意。 您可能想要限制结果,以获得与 OP 相同的结果。 std::ceil(log(2) / log(1.05)) 我目前的知识只扩展到循环和 if-else 语句,因为我是一个初学者程序员。我将如何在我的代码中实现这个对数?【参考方案2】:

要补充其他答案,这些答案在指出deposit &gt; 2*deposit 永远不会为真(您需要第二个变量来记录初始值!)方面基本上是正确的,您的循环完全结束的唯一原因是因为@ 987654322@ 变得如此之大,以至于2*deposit 由于溢出而“环绕”。

这似乎使2*deposit 大于deposit(逻辑上不可能——你需要修正这个比较!)虽然严格来说结果是不确定的。

显然,在 200 次左右的迭代之后,您就会遇到这种情况。

关于切换到像double 这样的浮点类型的建议,这很诱人,在这种简单的情况下可能就足够了,但作为一般规则,您应该在不需要时避免使用浮点因为它引入了复杂性和不准确性,却收效甚微。

我建议用整数便士或十分之一便士来计算。您可以通过将输入乘以 100 或 1000 来实现。然后,乘以 1.05 的增量乘法将具有舍入因子,但银行也将这样做!

【讨论】:

【参考方案3】:
if (deposit >= 2 * deposit) 
        cout << endl;
        cout << "Your money will double in "<< counter <<" years." << endl;
        break;
    

在上述if 语句中,您期望deposit 大于或等于2 times of deposit。仅当deposit 的值为零或小于零时才为真。

我建议您使用temp 变量来保留deposit 的输入值并继续。

【讨论】:

【参考方案4】:

这一行

if (deposit >= 2 * deposit) 

不会评估为true(除非deposit 为负数或排除某些极端情况)。您可能想将其与初始值进行比较。所以在这之后:

cin >> deposit;

我会放

double initialDeposit = deposit;

然后将另一行改为

if (deposit >= 2 * initialDeposit) 

【讨论】:

你说得对,我最初认为这可能是与小值有关的问题。我删除了它。【参考方案5】:

使用变量来存储初始存款,以便可以将其与累积的利息金额进行比较。

for (float initdeposit = deposit;; deposit = 1.05 * deposit)

    counter = counter+1;

    if (deposit >= 2 * initdeposit)
    
        cout << endl;
        cout << "Your money will double in "<< counter <<" years." << endl;
        break;
    
   

一个.exe

Deposit an amount NO LESS than 1000.
1000

Your money will double in 16 years.

注意:无论金额是多少,翻倍所需的时间始终相同。 :)

【讨论】:

以上是关于编写时间代码使年利率翻倍的主要内容,如果未能解决你的问题,请参考以下文章

用Python如何计算一笔定期存款10000元,一年期利率为2.25%,连本带息多少年后将翻倍?

用Python如何计算一笔定期存款10000元,一年期利率为2.25%,连本带息多少年后将翻倍

regionThatFits 使跨度区域翻倍

while - 函数

表刷新使数组项的数量翻倍

循环使笔记应用程序中的笔记数量翻倍