Seite 1 von 1

Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 12:35
von Hellstern
Hallo zusammen
Ich habe ein Problem beim runden und finde die Ursache nicht

Ich lese aus einer Excel Tabelle Messwerte ein
Beim einlesen kommt z.B. 3x hintereinander der Wert 19.8999996185303
Nun möchte ich diese Werte auf 2 Kommastellen runden

wert = float(wert_von_excel)
wert_round = round(wert, 2)
print(wert_round)

2x erhalte ich richtig 19.9
Beim 3. Mal lautet das Ergebnis allerdings 20.0, was falsch ist.

Kann mir jemand von Euch erklären, was die Ursache ist?


Gruss
Thomas

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 12:36
von sparrow
Wie soll da ohne Beispiel gehen?
Lass dir ausgeben, was du da tatsächlich rundest. Es wird nicht 3x der identische Wert sein, sonst würden nicht unterschiedliche Ergebnisse dabei herauskommen.

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 12:44
von Hellstern
Werte in Excel Tabelle
Zeit Wert
240 19.89999962
270 19.89999962
300 19.89999962

Ausgabe Print
Zeit: 240 --- Wert: 19.89999961853027
19.89999961853027
19.9
Zeit: 270 --- Wert: 19.89999961853027
19.89999961853027
19.9
Zeit: 300 --- Wert: 19.89999961853027
20.0

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 12:48
von sparrow
Und der Code, der das erzeugt?

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 12:57
von Hellstern
wb = load_workbook(file)
ws = wb.active

for row in ws:
index += 1
zeit = ws.cell(index, 1)
wert = ws.cell(index, 2)

try:
temp = float(wert.value)
print(temp)
wert_round = round(temp, 2)
print(wert_round)
x.append(zeit.value)
y.append(wert.value)
print("Zeit:",zeit.value, " --- Wert:", wert.value)
except:
print("String")

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 13:12
von sparrow
Nackte Excepts verwendet man nie. Fange nur die Exceptions, die du erwartest. Deshalb habe ich die hier raus genommen.

Code hier im Forum kommt zwischen Code-Tags, damit die Einrückung erhalten bleibt. Code-Tags werden eingefügt, wenn du den </>-Button im "vollständigen Editor" klickst.

Du gibst gar nicht aus, was du rundest, sondern die Ursprungswerte.

Was ist die Ausgabe hiervon?

Code: Alles auswählen

wb = load_workbook(file)
ws = wb.active

for row in ws:
    index += 1
    zeit = ws.cell(index, 1)    
    wert = float(ws.cell(index, 2))
    rounded = round(wert, 2)
    print(f"zeit: {repr(zeit)} - wert: {repr(wert)} - gerundet: {repr(rounded)}")

Womöglich wolltest du auch die Exception fangen, wenn der Wert nicht in einen float konvertiert werden kann.
In dem Fall:

Code: Alles auswählen

wb = load_workbook(file)
ws = wb.active

for row in ws:
    index += 1
    zeit = ws.cell(index, 1)
    try:
        wert = float(ws.cell(index, 2))
    except ValueError:
        wert = None
    if wert:
        rounded = round(wert, 2)
        print(f"zeit: {repr(zeit)} - wert: {repr(wert)} - gerundet: {repr(rounded)}")

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 13:34
von Hellstern
Vielen Dank

Vor lauter Bäumen sieht man manchmal den Wald nicht.
Aus Grund Deiner Nachfrage habe ich gemerkt, dass die print Ausgaben versetzt waren.

Auch Deine Tipps für mich als Anfänger waren sehr hilfreich

Gruss
Thomas

Re: Problem beim Runden

Verfasst: Samstag 28. Januar 2023, 13:56
von sparrow
Gerne :)