无法弄清楚为什么Python返回某些值

问题描述 投票:0回答:1

我正在开展一个项目,需要确定储蓄率以在 36 个月内支付首付。

用户输入自己的年薪。我将确定他们需要节省多少月薪才能达到 100 美元以内的首付。

假设: 银行每年支付4%的利息(4%/12个月) 他们的工资每 6 个月增加 7% 首付=250,000

该项目来自麻省理工学院课件。下面是完整的说明和我的工作:

C 部分:找到合适的储蓄金额

在 B 部分中,您有机会探索您的百分比如何 您每月节省的工资和每年的加薪会影响多长时间 你需要存钱来支付首付。这很好,但假设你 想要设定一个特定的目标,例如能够负担得起首付 三年内付款。您每个月应该存多少钱才能实现 这?在这个问题中,你将编写一个程序来回答这个问题 问题。为了简化问题,假设:3

  1. 您的半年加薪为 0.07 (7%)
  2. 您的投资年回报率为 0.04 (4%)
  3. 首付是房屋成本的0.25(25%)
  4. 您存钱买房子的成本是 100 万美元。

您现在要尝试找到最佳储蓄率来实现 36 个月内支付 100 万美元房屋的首付。既然正好击中了这个 是一个挑战,我们只是希望您的节省在 100 美元以内 需要预付定金。在 ps1c.py中,编写一个程序来计算 最佳储蓄率,作为您起薪的函数。你 应该使用二分搜索来帮助您有效地做到这一点。你 应该记录二等分所需的步数 搜索完成。您应该能够重用您的一些代码 为这个问题的 B 部分写的。

因为我们正在寻找一个原则上是浮点数的值, 我们将把自己的精确度限制在小数点后两位(即,我们 可能想要以 7.04% 或小数点表示的 0.0704 进行储蓄 – 但我们不是 会担心 7.041% 和 7.039% 之间的差异)。这 意味着我们可以搜索 0 到 10000 之间的整数(使用整数 除法),然后将其转换为小数百分比(使用 float 除法)在我们计算之后的当前储蓄时使用 36个月。通过使用这个范围,只有有限数量的 我们正在搜索的数字,而不是无限的数字 0 到 1 之间的小数。这个范围将有助于防止无限 循环。我们使用 0 到 10000 的原因是考虑到另外两个 小数位数范围为 0% 到 100%。你的代码应该打印出 小数(例如 0.0704 代表 7.04%)。

尝试不同的起薪输入,看看效果如何 您需要保存更改以达到所需下降的百分比 支付。另请记住,可能无法节省首付 一些工资在一年半内支付。在这种情况下你的 函数应通知用户无法保存 36 个月内支付首付并附有打印报表。请制作 您的程序以测试用例中所示的格式打印结果 下面。

注意:有多种正确的方法来实现二分 搜索/步骤数,因此您的结果可能与这些不完全匹配 测试用例。

提示

  • 可能存在多种储蓄利率,所产生的储蓄金额在 100 万美元房屋所需首付的 100 美元以内。在 在这种情况下,您可以只返回任何可能的值。
  • 根据您的停止条件以及您如何计算二分搜索的试验值,您的步数可能会略有不同 来自示例测试用例。
  • 在计算保存的百分比是否合适以及计算最终小数百分比时,请注意整数除法 储蓄率。
  • 记住在二分搜索的每次迭代中将适当的变量重置为其初始值。

我的代码:

semi_annual_raise = 1.07
r = 1 + (.04/12)
down_payment = int(250000)
starting_salary = float(input('Enter the starting salary: '))
monthly_salary = starting_salary / 12
current_savings = 0

epsilon = .01
savings_rate = 10000
guesses = 0
low = 0
high = savings_rate
ans = (high + low)//2
while abs(current_savings - down_payment) >= 100:
    for i in range(36):
        if i > 0 and i%6 == 0:
            monthly_salary = monthly_salary*semi_annual_raise
        current_savings += monthly_salary*(ans/10000) + (current_savings*r)
    if current_savings >= down_payment:
        high = ans
    else:
        low = ans
    guesses = guesses + 1
    ans = (high+low) // 2
print(guesses)
print(float(ans))
print(current_savings)

#For the life of me I cannot figure out why Python is outputting:

Enter the starting salary: 150000
2071
0.0
nan
python while-loop iteration range bisection
1个回答
0
投票
semi_annual_raise = 1.07
r = (.04/12)
down_payment = int(250000)
starting_salary = float(input('Enter the starting salary: '))
monthly_salary = starting_salary / 12
current_savings = 0

epsilon = .01
savings_rate = 10000
guesses = 0
low = 0
high = savings_rate
ans = (high + low)//2
while abs(current_savings - down_payment) >= 100:
    current_savings = 0
    monthly_salary = starting_salary / 12
    for i in range(36):
        if i > 0 and i%6 == 0:
            monthly_salary = monthly_salary*semi_annual_raise
        current_savings += monthly_salary*(ans/10000) + (current_savings*r)
    if current_savings >= down_payment:
        high = ans
    else:
        low = ans
    guesses = guesses + 1
    ans = (high+low) // 2
print(guesses)
print(float(ans))
print(current_savings)------------------------------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.