format()

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.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Ich bin gerade dabei eine formatierte Ausgabe in Python zu versuchen. Die Ausgabe mittels format() bereitet mir bei einem Integer Probleme:

Code: Alles auswählen

print("{:d} Einheiten zum Preis von {:.2f} EUR/St.".format(stueck,preis))
Und zwar bekomme ich einen ValueError:

Code: Alles auswählen

ValueError: Unknown format code 'd' for object of type 'float'
Ich vermute, dass ich die Syntax falsch einsetze bzw., dass der Formatter nicht zwischen Typen umschalten kann. In der Dokumentation habe ich gerade ein Beispiel gesehen, wo das funktioniert.

Gibt es eine Möglichkeit, wie ich umschalten kann, d. h., dass ein float-Wert als integer-Wert ausgegeben wird?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Fehlermeldung ist doch recht eindeutig. Du gibst im Format-String an, dass du einen Integer formatieren willst, übergibst aber ein Float. Du musst vorher eine Umwandlung mittels int durchführen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Es war zumindest meine Befürchtung. Ich hatte gehofft, dass ich die Typumwandlung an format() irgendwie delegieren könnte. Mit Integer-Werten schien es nach Doku zu gehen. Danke für die Rückantwort!!!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Jetzt stellt sich nur noch die Frage, warum stueck überhaupt ein float-Wert ist.
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

Weil ich stueck irgendwann im Programm dynamisch berechnen muss und dass dort nicht nach int umwandle, was vielleicht Sinn machen würde.
BlackJack

@/me: Na wenn man ein Stück ungefähr in der Mitte durchbricht hat man zweimal 0,5 Stück. Und wenn man ordentlich mit dem Hammer drauf haut, ganz viele 0,0irgendwas Stück. ;-)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Stückzahlen würde ich immer abrunden, sodass ich stets einen Integer habe. Denn halbe Stücke kann man ja schlecht herstellen oder anderweitig verwenden.

Also immer ``int(errechnete_stueckzahl)``.

Aber Vorsicht: Bei Zwischenergebnissen würde ich nicht runden, sondern nur beim Endergebnis.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@snafu: wenn ich einen Sack voll Stücke habe, und eine sehr genau Waage, kann es doch passieren, dass ich beim Ausrechnen mmm,999999 Stück bekomme, und das Abrunden ziemlich blöd ist.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Sirius3: Du würdest also Inventur machen, indem du Stücke des gleichen Artikels in einen Sack packst und wiegst? :o
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

snafu hat geschrieben:@Sirius3: Du würdest also Inventur machen, indem du Stücke des gleichen Artikels in einen Sack packst und wiegst? :o
Schrauben und Nägel werden auch so verkauft. Allerdings ist es bei den Mengen dann egal ob ich 7689 oder 7688 Nägel habe.

Ich stelle mir gerade vor wie der Architekt zum angehenden Hausbesitzer sagt: "Es tut mir leid, der Fertigstellungstermin verzögert sich um 4 Wochen. Wir hatten einen Nagel weniger als gedacht."
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Bei Kleinteilen verlässt man sich halt auf die Angaben des Lieferanten. Es ging ja um krumme Stückzahlen. Normalerweise würde man die Schrauben ja jetzt nicht wiegen, um ihre Anzahl festzustellen. Oder falls es doch gemacht wird (bin nicht so im Schrauben-Business involviert), dann würde ich trotzdem keine Kommazahlen erwarten im Endergebnis.
BlackJack

@snafu: Und auf wen verlässt man sich wenn man selbst der Lieferant ist? Und warum würdest Du bei der Rechnung gewogenes Gesamtgewicht geteilt durch Nominalgewicht eines Einzelstücks keine Gleitkommazahl erwarten? Es gibt Messungenauigkeiten *und* Schwankungen in den Gewichten von einzelnen Stücken. Das übliche Realität vs. Reissbrett halt. Ich wäre eher überrascht und sehr skeptisch wenn so eine konkrete Rechnung exakt aufgeht.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

pixewakb hat geschrieben:

Code: Alles auswählen

print("{:d} Einheiten zum Preis von {:.2f} EUR/St.".format(stueck,preis))
Dies ist die Codezeile aus dem Ausgangsbeitrag. Soll man jemandem jetzt eine halbe Einheit liefern?
BlackJack

@snafu: Wenn er die bestellt hat, ja. Man sollte aber vorher klären welche Hälfte der Schraube er braucht. ;-)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sorry, aber das ist doch sehr realitätsfremd. Niemand bestellt ernsthaft eine halbe Schraube oder ein halbes Auto. Ich kann ein halbes Pfund Mett bestellen. Aber da geht es um Maßeinheiten, was natürlich ein bißchen was anderes ist.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:@snafu: Und auf wen verlässt man sich wenn man selbst der Lieferant ist?

Dann zählt man halt ab und zu mal nach. Generell hat man bei Kleinteilen aber Mechanismen, die das Abpacken automatisch übernehmen. Oder wenn's Mitarbeiter tun, dann verlässt man sich auf deren Genauigkeit. Zwischendurch wie gesagt mal Stichproben zum Überprüfen nehmen. Und wenn in der Realität in einer Packung von 1.000 Nägeln mal einer fehlt, wird's auch kein Drama sein. Da wird sich weder ein Kunde beschweren, noch die Steuerbehörde in Bezug auf die Buchhaltung.
Und warum würdest Du bei der Rechnung gewogenes Gesamtgewicht geteilt durch Nominalgewicht eines Einzelstücks keine Gleitkommazahl erwarten?
Wenn da eine Kommazahl rauskommt, dann sollte man halt mal die Ursache für die Abweichung finden. Die Lösung kann ja wohl kaum sein, zu dokumentieren, dass man wohl 0,3 Teile von etwas im Lager hat. Entweder ganz oder garnicht.
Es gibt Messungenauigkeiten *und* Schwankungen in den Gewichten von einzelnen Stücken.

Deshalb ist Zählen ja auch oft sinnvoller als Wiegen. Zumindest wenn man Stückangaben braucht.
BlackJack

@snafu: Wir brauchen offenbar etwas deutlicheres als „;-)”…

Das zählen per Wiegen ist Praxis. Natürlich nicht bei Sachen die sich einfach zählen lassen. Aber es gibt Stückgut das in grösseren Mengen vorkommt und eine Menge verschiedene Gründe warum man nicht weiss wie viele Stücke man da gerade vor sich hat. Und das manuelle oder auch maschinelle abzählen, zum Beispiel von Millionen von Schrauben ist nun mal um einiges unpraktischer als den Kram zu wiegen und durch das Gewicht eines Einzelstücks zu teilen. Da ist zählen keine sinnvolle Alternative.

Die Ursachen für eine Abweichung bei dieser Methode sind ja bekannt: Messungenauigkeit und Schwankungen beim Gewicht der Einzelstücke. Beides kann man nicht auf 0 drücken, also muss man damit anders umgehen.

Wenn man die Anzahl ganzer Stücke als Ergebnis haben möchte, dann muss man am Ende der Rechnung halt runden.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:Wenn man die Anzahl ganzer Stücke als Ergebnis haben möchte, dann muss man am Ende der Rechnung halt runden.
Und nichts anderes wollte ich sagen. :mrgreen:

Ich schrieb ja schon in meinem ersten Beitrag zu dem Thema, dass ich mich auf das Endergebnis beziehe. Aber schön, dass wir darüber gesprochen haben. :)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:Und das manuelle oder auch maschinelle abzählen, zum Beispiel von Millionen von Schrauben ist nun mal um einiges unpraktischer als den Kram zu wiegen und durch das Gewicht eines Einzelstücks zu teilen.
Wobei ich da eher erwarten würde, dass man die Anzahl der Pakete mit den dafür angegebenen Stückzahlen multipliziert. Oder glaubst du, man öffnet am Ende des Geschäftsjahres alle Schrauben-Kartons, legt alles in eine große Schüssel und stellt es anschließend auf die Waage?
BlackJack

@snafu: Nochmal: So etwas wird in der Praxis *gemacht*. Wenn man Packungen hat, dann kann man die ja zählen, es gibt aber ob Du das nun glauben magst oder nicht (so wie Du Dich gegen diese Idee zu wehren scheinst) wo man ganz einfach ganz viele Stücke von irgendwas hat, was sich schlicht und einfach nicht praktikabel einzeln zählen lassen. Schrauben sind ja nur ein Beispiel. Das können auch andere Werkstücke sein. Wo zum Beispiel Reststücke von verschiedenen Produktionsstrassen, oder B-Ware, die nicht hübsch gezählt und abgepackt werden sondern erst einmal in Kisten landen die dann später in grösseren Kisten/Tonnen/Säcken zusammengeschüttet werden, oder so etwas kommt einzeln von irgendwo anders zurück vom Handel oder von der Verarbeitung, und dann hat man einen Haufen Stücke und möchte halt möglichst einfach, aber trotzdem möglichst genau wissen wie viele das sind.
Antworten