Vielleicht trivial, aber mir war die Antwort bislang nicht klar: Wie
gebe ich eine Gleitkomma-Zahl aus, ohne dass Stellen wegfallen oder
überflüssige Nullen am Ende erscheinen?
Bei der Ausgabe von Gleitkommazahlen habe ich bislang automatisch zu
printf/sprintf und %f gegriffen, aber das Format-Element %f formatiert
die Zahlen ja immer auf eine feste Anzahl an Stellen und rundet auf
die letzte Stelle. Z.B.
my $x = 0.123456789;
printf "%f",$x;
ergibt
(%f formatiert/rundet per Default auf 6 Nachkommastellen)
Natürlich kann ich die Anzahl der Stellen groß wählen, aber dann
bekomme ich u.U. zusätzliche Stellen, wenn die betreffende Zahl binär
nur näherungsweise dargestellt werden kann:
my $x = 0.123456789;
printf "%.20f",$x;
ergibt
Andererseits erhalte ich am Ende überflüssige Nullen bei Zahlen, die
dezimal weniger als die vorgegebenen Stellen besitzen:
my $x = 0.5;
printf "%.20f",$x;
ergibt
Was tun?
Die Lösung ist (anscheinend) einfach: Ich gebe die Zahl nicht als Zahl
sondern als String aus! D.h. im Falle von printf/sprintf mit
Format-Element %s!
Damit erhalte ich, was ich will. Die Zahl mit allen Stellen und nicht mehr
my $x = 0.123456789;
printf "%s",$x;
-> 0.123456789
und ohne überflüssige Nullen
my $x = 0.5;
printf "%s",$x;
-> 0.5
Bei näherer Überlegung leuchtet das ein, da Perl intern neben der
(binären) numerischen Repräsentation eine Stringrepräsentation des
Werts speichert, welche anfänglich genau der Zeichenfolge bei der
Zuweisung entspricht.
Schlussfolgerung: Programme, die nicht rechnen, sondern
Gleitkommazahlen nur einlesen und wieder ausgeben, sollten, um
Verfälschungen auszuschließen, diese bei der Ausgabe grundsätzlich als
Strings und nicht als Zahlen behandeln.