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

时间:2016-03-24 21:41:12

标签: python math decimal rounding average

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

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

但是,我应该取这个数字并将向上舍入到最接近的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

4 个答案:

答案 0 :(得分:2)

向上舍入到最接近的1/8%:

import math

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

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

答案 1 :(得分:0)

如果您被特别告知要围绕向上,则应使用ceiling

import math

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

答案 2 :(得分:0)

在计算加权平均利率时,您将需要重新计算。
一些与利率有关的计算来源:

我认为这是完成您要求的最好方法:

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%,这应该是这样),那么情况就不同了。

答案 3 :(得分:-1)

根据需要乘以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