Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的代码是这个作业的正确实现吗?_Python - Fatal编程技术网

Python 我的代码是这个作业的正确实现吗?

Python 我的代码是这个作业的正确实现吗?,python,Python,问题是编写python来计算贷款到期利息并打印付款计划。贷款到期利息可根据以下简单公式计算: I=p×R×T 式中,I为支付的利息,p为借款金额(本金),R为利率,T为贷款期限 最后,它需要显示如下: import decimal from decimal import * class loan_calc: def __init__(self): decimal.getcontext().prec = 3 p = Decimal(input('Please enter your lo

问题是编写python来计算贷款到期利息并打印付款计划。贷款到期利息可根据以下简单公式计算:

I=p×R×T

式中,I为支付的利息,p为借款金额(本金),R为利率,T为贷款期限

最后,它需要显示如下:

import decimal
from decimal import *
class loan_calc:

 def __init__(self):
  decimal.getcontext().prec = 3
  p = Decimal(input('Please enter your loan amount:'))
  r = Decimal(input('Please enter the rate of interest:'))
  t = Decimal(input('Please enter loan period:'))
  r_e = r/100
  i = p*r_e*t 
  term = t*12
  r_a = p+i
  amnt = p/term
  count = 0
  b_r = r_a
  print "Payment\t\tAmount Paid\t\tBal.Rem."
  while count <= term:
   if count == 0:
    print count,"\t\t"'0.00'"\t\t\t",b_r
    count += 1
    b_r -= amnt
    continue

   if term - count == 1:
    amnt = b_r
    print count,"\t\t",amnt,"\t\t\t",b_r
    count += 1
    b_r -= amnt
    continue

   else: 
    print count,"\t\t",amnt,"\t\t\t",b_r
    b_r -= amnt
    count += 1
    continue



loan = loan_calc()
该程序将打印借款金额、支付的利息总额、每月付款金额和付款计划

示例会话

Loan calculator

Amount borrowed: 100
Interest rate: 6
Term (years): 1

Amount borrowed:    $100.00
Total interest paid:  $6.00

           Amount     Remaining
Pymt#       Paid       Balance
-----      -------    ---------
  0        $ 0.00      $106.00
  1        $ 8.84      $ 97.16
  2        $ 8.84      $ 88.32
  3        $ 8.84      $ 79.48
  4        $ 8.84      $ 70.64
  5        $ 8.84      $ 61.80
  6        $ 8.84      $ 52.96
  7        $ 8.84      $ 44.12
  8        $ 8.84      $ 35.28
  9        $ 8.84      $ 26.44
 10        $ 8.84      $ 17.60
 11        $ 8.84      $  8.76
 12        $ 8.76      $  0.00
完整的问题描述如下: 为了实现这一点,我编写了如下代码:

import decimal
from decimal import *
class loan_calc:

 def __init__(self):
  decimal.getcontext().prec = 3
  p = Decimal(input('Please enter your loan amount:'))
  r = Decimal(input('Please enter the rate of interest:'))
  t = Decimal(input('Please enter loan period:'))
  r_e = r/100
  i = p*r_e*t 
  term = t*12
  r_a = p+i
  amnt = p/term
  count = 0
  b_r = r_a
  print "Payment\t\tAmount Paid\t\tBal.Rem."
  while count <= term:
   if count == 0:
    print count,"\t\t"'0.00'"\t\t\t",b_r
    count += 1
    b_r -= amnt
    continue

   if term - count == 1:
    amnt = b_r
    print count,"\t\t",amnt,"\t\t\t",b_r
    count += 1
    b_r -= amnt
    continue

   else: 
    print count,"\t\t",amnt,"\t\t\t",b_r
    b_r -= amnt
    count += 1
    continue



loan = loan_calc()
导入十进制
从十进制输入*
类别贷款计算:
定义初始化(自):
decimal.getcontext().prec=3
p=小数(输入('请输入您的贷款金额:'))
r=十进制(输入('请输入利率:'))
t=小数(输入('请输入贷款期间:'))
r_e=r/100
i=p*r\u e*t
术语=t*12
r_a=p+i
amnt=p/项
计数=0
b_r=r_a
打印“Payment\t\t已付款的金额\t\tBal.Rem”
计数时,使用
十进制(input())
是错误的:

>>> decimal.getcontext().prec=3
>>> decimal.Decimal(input('enter the number: '))
enter the number: 0.1
Decimal('0.1000000000000000055511151231257827021181583404541015625')
使用
input
会导致Python对输入求值,从而创建一个浮点值。通过使用
raw_input
并将字符串直接传递给
Decimal
,解决此问题:

>>> decimal.Decimal(raw_input('enter the number: '))
enter the number: 0.1
Decimal('0.1')

将代码缩进4个空格,紧跟其后,并避免使用单字符变量名。

首先,我建议不要同时执行
导入十进制
从十进制导入*
。选择一个并使用你需要的东西。通常,我会导入
任何内容
,然后使用
任何内容

正如评论者已经指出的,没有必要为这么简单的事情创建一个类(除非这是家庭作业,并且你的导师需要)。删除类声明,将
def\uuu init\uuu(self)
更改为
def main()
,并在当前实例化loan\u类的位置调用main。有关主要功能的更多信息,请参阅关于它们

应检查输入值。一种简单的方法是使用try-except块,因为它们被转换为十进制。代码可能类似于:

prin_str = raw_input('Please enter your loan amount: ')
try:
    principal = decimal.Decimal(prin_str)
except decimal.InvalidOperation:
    print "Encountered error parsing the loan amount you entered."
    sys.exit(42)
要使其正常工作,您必须在sys.exit()调用之前的某个时间导入sys。我通常将导入内容放在文件的开头

由于您的所有输入都是同一类型的,所以您可以轻松地将其设置为通用函数,然后为每个输入调用该函数

在计算中似乎确实存在某种缺陷。解决这一问题留给读者作为练习。;-)

重写(在Python 3中,对不起)。我不确定我是否理解算法,但你可以修改它。也许这会有帮助

import decimal

balance = decimal.Decimal(input("Amount borrowed: "))
rate = decimal.Decimal(input("Rate (%): ")) / 100
term = int(input("Term (years): "))

print("\t".join(s.rjust(15) for s in ("Payment", "Amount Paid", "Balance")))
print("-"*54)

balance *= (1 + rate * term)
payment = balance / (12 * term)
total = 0
for month in range(12 * term):
    if balance < payment:
        payment = balance
    print(("{: >15.2f}\t"*3)[:-1].format(payment, total, balance))
    total += payment
    balance -= payment
导入十进制
余额=十进制。十进制(输入(“借款金额:”)
比率=十进制。十进制(输入(“比率(%):”)))/100
期限=整数(输入(“期限(年):”)
打印(“\t”.join(s.rjust(15)表示“付款”、“已付款金额”、“余额”))
打印(“-”*54)
余额*=(1+利率*期限)
付款=余额/(12*期限)
总数=0
范围内的月份(12*学期):
如果余额<付款:
付款=余额
打印(“{:>15.2f}\t”*3[:-1]。格式(付款、总额、余额))
总额+=付款
余额-=支付
请注意以下事项:

  • 没有愚蠢的变量名。每件事都是按其本来面目命名的
  • 字符串格式设置,使打印更整洁
  • 没有讨厌的
    ,而
    循环出现多个案例。您将在学期中每月打印一行,因此使用
    for
    循环

    • 这里有一个与你的写作方式非常相似的答案。使用我在您询问时解释和建议的方法,它使用
      decimal
      模块与
      math
      模块的
      ceil
      函数等效,以获得与练习链接所示相同的答案(除了一些次要的输出格式)。我还将代码缩进到更常用的4-空间,并将变量重命名为可读性更强的变量。希望你能从中学到一些东西。请注意,我没有将
      decimal.getcontext().prec
      设置为
      3
      (我不相信它会像您所想的那样)


      逻辑与之前的答案基本相同,但经过了严重的重新格式化。享受吧

      # Loan payment calculator
      import decimal
      
      def dollarAmt(amt):
          "Accept a decimal value and return it rounded to dollars and cents"
          # Thanks to @Martineau!
          # I found I had to use ROUND_UP to keep the final payment
          # from exceeding the standard monthly payments.
          return amt.quantize(decimal.Decimal('0.01'), rounding=decimal.ROUND_UP)
      
      def getAmt(msg):
          "Get user input and return a decimal value"
          return decimal.Decimal(raw_input(msg))
      
      class MonthlyFixedPaymentLoan(object):
          def __init__(self, principal, yearlyRate, months):
              self.principal  = principal
              self.yearlyRate = yearlyRate
              self.months     = months
      
              self.interest   = dollarAmt(principal * yearlyRate * (months/12))
              self.balance    = principal + self.interest
              self.payment    = dollarAmt(self.balance / months)
      
          def __str__(self):
              return ("Amount borrowed:     ${0:>10}\n" +
                      "Total interest paid: ${1:>10}").format(dollarAmt(self.principal), dollarAmt(self.interest))
      
          def payments(self):
              # 'month 0'
              yield 0, decimal.Decimal('0.00'), self.balance
      
              pmt = self.payment
              bal = self.balance
              for mo in range(1,self.months):
                  bal -= pmt
                  yield mo, pmt, bal
      
              # final payment
              yield self.months, bal, decimal.Decimal('0.00')
      
      def main():
          amt  = getAmt('Amount borrowed ($): ')
          rate = getAmt('Interest rate (%/yr): ')
          pd   = getAmt('Loan term (years): ')
      
          loan = MonthlyFixedPaymentLoan(amt, rate/100, pd*12)
      
          print('')
          print(loan)
          print('')
          print('Month     Payment       Balance')
          print('-----    --------    ----------')
      
          for mo,pay,rem in loan.payments():
              print('{0:>4}     ${1:>7}    ${2:>9}'.format(mo, pay, rem))
      
      if __name__=="__main__":
          main()
      

      有什么不起作用的吗?另外,我认为你不需要一个
      。@sukhbir是对的,这个类没有任何用途。你可以去掉这个类,把
      \uuuu init\uuu
      重命名为main或者其他什么。好的,我会删除这个类。代码中还有什么错误?谢谢你的回答。@Harbhag我用借来的100英镑、利息6英镑和期限1运行了这个程序,但我没有得到你发布的结果。@Harbhag:既然没有错误,它能按你的预期工作吗?如果是,那就好了。只要去掉
      ,它就没有用了。另外,
      import decimal
      是您应该做的,不要从decimal import*
      执行
      。并将
      input
      更改为
      raw\u input
      ,正如jleedev在回答中指出的那样。我已经更改了代码,现在正在使用raw\u input。我不知道PEP8,我现在就来读。你们真的很有帮助。Thanks@katriel:不可能是Python 3。请注意,这是
      print
      语句,而不是函数;)你的代码很优雅。我试着用python3运行它,但支付的金额一直在增加。啊,我误解了
      支付的金额
      是指
      支付的总金额,永远
      。您应该能够重写算法以打印本月支付的
      金额
      ——您需要删除几行并修改
      打印
      调用。当然,我从您的代码中学到了很多。它工作正常,谢谢你回答我的问题。尊重