Thread Richtig INTen (14 answers)
Opened by bianca at 2009-12-24 09:27

GUIfreund
 2012-01-20 17:48
#155564 #155564
User since
2011-08-08
559 Artikel
BenutzerIn
[default_avatar]
2012-01-17T18:29:18 bianca
2012-01-17T18:12:29 GUIfreund
Ich habe nur gesagt, dass meine sub mit_sprintf beim Testfall
Quote
.57 * 100,'=57',
das richtige Resultat liefert. Und das stimmt nach wie vor.

Ja, eine Spitzfindigkeit. Klar liefert es das "richtige" Ergebnis. Aber es bringt mir ja nichts, wenn das computerrichtige Ergebnis mathematischer Nonsens ist. 0.57 * 100 ist nun mal nicht 56 sondern 57, egal ob ich das int'e oder nicht :))

Beim Lesen deiner Antwort bekam ich den Eindruck, dass du glaubst, mit "das richtige Resultat" hätte ich 56 gemeint. Ich hätte genauer "das von dir erwartete Resultat" schreiben sollen. Entschuldige bitte.
2012-01-17T18:29:18 bianca
Auf den ersten Blick übergibst du .57*100 an int() und es kommt 56 raus. Rechnest du ohne int() kommt 57 raus, siehe hier:
Code (perl): (dl )
1
2
print "int : ".(int(.57*100))."\n";
print "ohne: ".(.57*100)."\n";

Quote
int : 56
ohne: 57

2012-01-17T18:29:18 bianca
Rechnest du ohne int() kommt 57 raus

Das sieht nur so aus. Wie ich schon früher schrieb, ergibt .57*100 auf meinem PC 56.999999999999993. (Das ist übrigens nicht falsch, sondern ungenau. Hoffentlich hältst du das nicht wieder für spitzfindig.) Auf deinem Rechner kann das Ergebnis der Multiplikation anders als bei mir sein, ist aber offenbar ebenfalls zu klein. print() rundet dann - rundet anders als int() - und liefert 57.

int() rundet durch Abschneiden der Nachkommastellen. Da es dir beim Runden darauf ankommt, Ungenauigkeiten der Hardware-Arithmetik auszubügeln (also Zahlen zu runden, die meistens fast ganzzahlig sind), wirst du mit Runden zur nächstliegenden ganzen Zahl wohl mehr Erfolg haben. Das kannst du in Perl z. B. auf folgende Weisen erreichen:
Code (perl): (dl )
1
2
my $rund = sprintf '%.0f', $wert);
my $rund = int($wert + 0.5);

Probier's mal aus.
Gruß
GUIfreund

View full thread Richtig INTen