5 Stimmen

Wie man in Perl das Format von Exponentialzahlen in das Fließkommaformat ändert

Ich habe eine Zeichenkette in Perl, die eine kleine Zahl enthält: $num = "0.00000001";

Wenn ich eine numerische Operation damit durchführe, wird daraus eine Zahl im Exponentialformat: $num = $num * 100; print "$num \n ";

Das Ergebnis ist: 1e-06

Die Frage ist, wie man diese Zahl im Fließkommaformat ausgeben kann, d.h. 0,000001.

Ich weiß, dass ich das für eine bestimmte Zahl mit sprintf("%.6f", $num) machen kann, aber ich möchte eine generische Lösung haben, damit ich nicht jedes Mal bestimmen muss, wie viele Ziffern nach dem Dezimalpunkt angezeigt werden sollen (wie 6 in dem obigen sprintf-Beispiel)

5voto

Keith Thompson Punkte 240701

Wenn Sie eine numerische Operation auf $num wird sie zu einer Gleitkommazahl. 1e-06 y 0.000001 sind textuelle Repräsentationen dieser Zahl; der gespeicherte Wert unterscheidet nicht zwischen ihnen.

Wenn Sie die Zahl einfach ausdrucken oder aneinanderreihen, wird ein Standardformat verwendet, das, wie Sie gesehen haben, zu folgenden Ergebnissen führt "1e-06" . Verwendung von sprintf mit einem Format von "%f" wird Ihnen ein vernünftiges Ergebnis liefern; sprintf("%f", $num) produce "0.000001" .

Aber die "%f" Format können Informationen verloren gehen. Zum Beispiel:

$num = "0.00000001";
printf("%f\n", $num);

Drucke:

0.000000

Sie sagen, dass Sie drucken möchten, ohne jedes Mal bestimmen zu müssen, wie viele Stellen nach dem Dezimalpunkt angezeigt werden sollen. Etwas muss diese Entscheidung treffen, und es gibt keine allgemeingültige Methode, dies zu tun. Es liegt nahe, nur die signifikanten Ziffern auszudrucken und die Nullen am Ende wegzulassen, aber das wirft einige Probleme auf. Wie viele Ziffern drucken Sie für 1.0/3.0 , dessen Dezimaldarstellung eine unendliche Folge von 3 s? Und 0.00000001 kann nicht exakt in binärer Fließkommadarstellung dargestellt werden:

$num = "0.00000001";
printf("%f\n", $num);    
printf("%.78f\n", $num);

Drucke:

0.000000
0.000000010000000000000000209225608301284726753266340892878361046314239501953125

4voto

daxim Punkte 38607

使用する Nagetiere von ungewöhnlicher Größe :

$ perl -Mbigrat -E'$num = 0.00000001; $num *= 100; say $num'
0.000001

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X