Python 我的代码是这个作业的正确实现吗?
问题是编写python来计算贷款到期利息并打印付款计划。贷款到期利息可根据以下简单公式计算: I=p×R×T 式中,I为支付的利息,p为借款金额(本金),R为利率,T为贷款期限 最后,它需要显示如下: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
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运行它,但支付的金额一直在增加。啊,我误解了支付的金额
是指支付的总金额,永远
。您应该能够重写算法以打印本月支付的金额
——您需要删除几行并修改打印
调用。当然,我从您的代码中学到了很多。它工作正常,谢谢你回答我的问题。尊重