Problem beim Runden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hellstern
User
Beiträge: 11
Registriert: Mittwoch 4. Januar 2023, 08:14

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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.
Hellstern
User
Beiträge: 11
Registriert: Mittwoch 4. Januar 2023, 08:14

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Und der Code, der das erzeugt?
Hellstern
User
Beiträge: 11
Registriert: Mittwoch 4. Januar 2023, 08:14

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")
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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)}")
Hellstern
User
Beiträge: 11
Registriert: Mittwoch 4. Januar 2023, 08:14

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Gerne :)
Antworten