Runden(Python)

Aus IT074-Wiki

Wechseln zu: Navigation, Suche
#!/usr/bin/env python
 
import sys
from decimal import *
 
# angenommen der dateiname kommt per kommandozeile
try:
        input = sys.argv[1]
        output = sys.argv[2]
        input = open(input)
        output = open(output, 'w')
        precision = Decimal (10) ** -2
        for line in input:
                wkn, kurs, zeit, _ = line.split(',')
                kurs = str( (Decimal(kurs)*Decimal("0.7693"))\
                                .quantize(precision)).replace('.',',')
                output.write("WKN=" + wkn + " Wert=" + kurs + " Euro\n")
except IndexError:
        print "usage:"
        print sys.argv[0] + " input ouptput"
        sys.exit(-1)
except IOError, err:
        print str(err)
        if type(input) == file and not input.closed: input.close()
        if type(output) == file and not output.closed: output.close()
        sys.exit(-1)
else:
        if not input.closed: input.close()
        if not output.closed: output.close()
        sys.exit(0)

Anmerkungen:
Wegen z.B. 0,110 = 0,0001100110011...2 ist ein einfaches Arbeiten mit floats nicht immer möglich (Theorie). Es kommt dann ggf. zu Rundungsfehlern, zehnfaches Addieren von 0.1 (0.1 + ... + 0.1) etwa liefert nicht genau 1.0, round(0.1, 1) ebenfalls nicht. Abhilfe schafft hier das Modul "decimal".
Der Klasse "Decimal" kann ein String oder Int übergeben werden und sie gibt dann ein entsprechendes Decimal-Objekt zurück, mit dem normal gerechnet werden kann und das (z.B. mit print) auch ausgegeben werden kann. Die Methode "quantize" rundet ein gegebenes Decimal-Objekt entsprechend der ihr übergebenen Präzision, die ebenfalls wieder vom Typ "Decimal" sein muss. Decimal("0.43123").quantize(Decimal("0.01")) ergibt also: Decimal("0.43"), wohingegen das eigentlich äquivalente round(0.43123, 2) = 0.4299999999999...