【问题标题】: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,我自己做这个,虽然我们目前的课程是关于循环的,所以这就是我的知识范围

标签: c++ numerical-methods


【解决方案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.
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        相关资源
        最近更新 更多