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

Python:四舍五入到最接近的1/8%,python,math,decimal,rounding,average,Python,Math,Decimal,Rounding,Average,我试图计算Python 2.7中贷款的平均加权利率 我从浮动开始,这是有问题的。考虑到这些输入(贷款1$20000 6.80%;贷款2$10000 7.90%;贷款3$10000 5.41%),正确的结果是6.7275。使用Decimal,我的代码输出该值 但是,我应该取这个数字,四舍五入到最接近的1/8%,然后将结果显示为6.75。当我使用格式四舍五入到两个位置时,我得到6.73。虽然这是我所期望的,但is不符合此函数应该执行的操作范围 from decimal import Decimal

我试图计算Python 2.7中贷款的平均加权利率

我从浮动开始,这是有问题的。考虑到这些输入(贷款1$20000 6.80%;贷款2$10000 7.90%;贷款3$10000 5.41%),正确的结果是6.7275。使用Decimal,我的代码输出该值

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

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

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

import math

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

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

乘以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

如果有人特别要求您将四舍五入,您应该使用

在计算加权平均利率时,您必须进行四舍五入。
有关利率计算的一些来源:

我认为这是实现你要求的最好方式:

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%),那是另一种情况。

乘以8,四舍五入到最接近的整数,除以8?我肯定你的意思是最接近的
1/4
,对吗?@pp_;我被特别告知“下一个最接近的1/8%”,但是问我这个问题的人可能犯了一个错误。对于提供的输入,您的代码返回
672.75
?@padraiccnningham单元测试(0.0680,0.0790,0.0541200001000010000)返回6.73。但是,是的,我应该包括更多的地方,它会去6.7275…和0.76是四舍五入到…它四舍五入到0.75。截止值是0.8125,然后再四舍五入到0.875“…取该数字并四舍五入到最近的…”好的一点,我注意到“当我使用格式四舍五入到两个位置时”欢迎使用堆栈溢出!虽然此代码可能会回答该问题,但提供有关此代码为什么和/或如何回答该问题的附加上下文可提高其长期价值。
math.ceil(x * (8)) / 8