【问题标题】:Python: Rounding to Nearest 1/8%Python:四舍五入到最接近的 1/8%
【发布时间】:2016-03-24 21:41:11
【问题描述】:

我正在尝试计算 Python 2.7 中贷款的平均加权利率。

我从花车开始,这是有问题的。给定这些输入(Loan #1 $20,000 6.80%;Loan #2 $10,000 7.90%;Loan #3 $10,000 5.41%),正确的结果是 6.7275。使用十进制,我的代码输出。

但是,我应该取那个数字并将 up 舍入到最接近的 1/8%,然后将结果显示为 6.75。当我使用格式四舍五入到两个位置时,我得到 6.73。虽然这是我所期望的,但不符合此功能应做的范围。

from decimal import Decimal

def weightedAvgFixedArgs(r1,r2,r3,b1,b2,b3):
    rates = [Decimal(r1),Decimal(r2),Decimal(r3)]
    balances = [Decimal(b1),Decimal(b2),Decimal(b3)]

    a = Decimal(b1) * Decimal(r1)
    b = Decimal(b2) * Decimal(r2)
    c = Decimal(b3) * Decimal(r3)

    perLoanWghtFctr = a + b + c

    totalLoanAmt = sum(balances)

    intRate = (perLoanWghtFctr / totalLoanAmt) * 100

    return format(intRate, '.2f')

编辑:Joachim Isaksson 的建议提供了我要求的输出和我提供的输入。我没有在我的特定用例中对此进行广泛测试,但它正确回答了我提出的问题。

# return format(intRate, '.2f')
z = intRate * 8
y = format(z, '.0f')
x = Decimal(y) / Decimal(8)
return x

【问题讨论】:

  • 乘以8,四舍五入,除以8?
  • 我确定您的意思是最近的1/4,对吧?
  • @pp_ 我被明确告知“下一个最接近的 1/8%”,但问我这个的人可能犯了一个错误。
  • 您的代码为所提供的输入返回672.75
  • @PadraicCunningham (0.0680,0.0790,0.0541,20000,10000,10000) 的单元测试返回 6.73。但是,是的,如果我包含更多的地方,它将转到 6.7275。

标签: python math decimal rounding average


【解决方案1】:

四舍五入到最接近的 1/8%:

import math

>>> math.ceil(.73 * 8) / 8
0.75

>>> math.ceil(.76 * 8) / 8
0.875

【讨论】:

  • ...和 ​​0.76 向上舍入到...?
  • 四舍五入到 0.75。截止值为 0.8125,然后下一轮向上取整至 0.875
  • "...取该数字并向上四舍五入到最近的..."
  • 好点,我注意到“当我使用格式四舍五入到两个位置时”
【解决方案2】:

如果您被明确告知要四舍五入向上,则应使用ceiling

import math

x = 6.7275
x = math.ceil(x * 8)/8  # x == 6.75

【讨论】:

    【解决方案3】:

    在计算加权平均利率时,您必须向上取整。
    有关与利率相关的计算的一些来源:

    我认为这是满足您要求的最佳方式:

    import math
    x = 6.73
    math.ceil(x / (1/8)) * (1/8)
    

    我个人并没有清楚(数学)解释为什么先做乘法然后再做除法也有效。或者用值 8 而不是 1/8 来做。下面的例子似乎也有效:

    math.ceil(x * (8)) / 8
    

    两者都有效。在第一个示例中,您可以将其用作给定值,即 (1/8),在第二个示例中,您可以将 ut 用作整数,在本例中为 8。

    如果您只想四舍五入到最接近的 1/8%(而不是 四舍五入 到最接近的 1/8%,因为它应该是),那是另一种情况。

    【讨论】:

      【解决方案4】:

      乘以 8,取整或截断,然后除以 8,示例代码如下:

      for i in range(0,10):
          v = i/10.0
          v = round(v*8) / 8.0
          print i/10.0, v
      

      运行它你会得到:

      0.0 0.0
      0.1 0.125
      0.2 0.25
      0.3 0.25
      0.4 0.375
      0.5 0.5
      0.6 0.625
      0.7 0.75
      0.8 0.75
      0.9 0.875
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多