2016-03-24 10 views
1

Ich versuche, die durchschnittlichen gewichteten Zinssätze von Darlehen in Python 2.7 zu berechnen.Python: Rundung zum nächsten 1/8%

Ich begann mit Schwimmern, und das war problematisch. Angesichts dieser Eingaben (Darlehen # 1 $ 20.000 6,80%; Darlehen # 2 $ 10.000 7,90%; Darlehen # 3 $ 10.000 5,41%) ist das korrekte Ergebnis 6.7275. Mit Decimal gibt mein Code das aus.

Allerdings sollte ich diese Nummer und Runde bis 0/auf die nächsten 1/8% nehmen und das Ergebnis stattdessen als 6,75 anzeigen. Wenn ich das Format verwende, um auf zwei Plätze zu runden, bekomme ich 6,73. Obwohl das ist, was ich erwarten würde, ist nicht der Umfang dessen, was diese Funktion tun sollte.

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') 

Bearbeiten: Joachim Isakssons Vorschlag liefert den Ausgang, den ich mit den von mir bereitgestellten Eingängen angefordert habe. Ich habe das nicht ausführlich in meinem speziellen Anwendungsfall getestet, aber es beantwortet richtig die Frage, die ich gestellt habe.

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

Mit 8 multiplizieren, auf nächste Ganzzahl aufrunden, durch 8 dividieren? –

+0

Ich bin sicher, du meinst auf die nächste '1/4', richtig? –

+0

@pp_ Mir wurde speziell gesagt "nächste nächste 1/8%", aber die Person, die mich darum bittet, könnte einen Fehler gemacht haben. – Kilpatrick

Antwort

2

zum nächsten 08.01% Zur Abrundung:

import math 

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

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

No numpy necessary. –

+1

... und 0.76 ist aufgerundet auf ...? –

+0

Es wird auf 0,75 abgerundet. Der Cut-Off ist 0.8125, bevor es auf 0.875 weitergeht – Alexander

-1

Multiply 8, rund oder gestutzt, wie Sie wollen, dann durch 8 teilen, hier ist der Beispielcode:

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

Run es Sie erhalten:

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 
+1

Willkommen Überlauf stapeln! Während dieser Code die Frage beantworten kann, verbessert ein zusätzlicher Kontext, warum und/oder wie dieser Code die Frage beantwortet, seinen langfristigen Wert. – Ajean

+0

Beratung genommen ... – Hang

0

Wenn Sie ausdrücklich aufgefordert werden, bis zu runden, sollten Sie ceiling verwenden.

import math 

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