Heim >Backend-Entwicklung >Golang >Wie drucke ich Float64-Zahlen in Go mit fester Breite und maximaler signifikanter Ziffer?

Wie drucke ich Float64-Zahlen in Go mit fester Breite und maximaler signifikanter Ziffer?

Barbara Streisand
Barbara StreisandOriginal
2024-12-04 01:47:10622Durchsuche

How to Print Float64 Numbers in Go with Fixed Width and Maximum Significant Digits?

Float64-Zahlen mit fester Breite und signifikanten Ziffern drucken

Stellen Sie sich vor, Sie müssten Float64-Zahlen in einer Tabelle mit einer festen Breite von 12 Zeichen drucken und die maximal mögliche Anzahl signifikanter Ziffern. Betrachten Sie die folgenden Beispiele:

fmt.Printf("%12.6g\n", 9.405090880450127e+119) //"9.40509e+119"
fmt.Printf("%12.6g\n", 0.1234567890123)        //"    0.123457"
fmt.Printf("%12.6g\n", 123456789012.0)         //" 1.23457e+11"

Wie Sie sehen können, kann die Standardfunktion fmt.Printf mit dem Formatbezeichner .6g entweder signifikante Ziffern abschneiden oder wissenschaftliche Notation verwenden, was zu einem Verlust an Präzision führt. Gibt es eine Möglichkeit, unsere gewünschte Formatierung mithilfe von Standardbibliotheksfunktionen zu erreichen?

Benutzerdefinierte Formatierung zur Rettung

Es gibt keine einfache Standardbibliotheksfunktion, die genau unseren Anforderungen entspricht. Wir können jedoch eine benutzerdefinierte Formatierungsfunktion entwickeln, die die gewünschte Breite und die höchstwertigen Ziffern berücksichtigt. So gehen wir vor:

  1. Überprüfen Sie, ob die Zahl größer oder gleich 1e12 ist, da dies der Wendepunkt zwischen regulärer Form und wissenschaftlicher Notation ist.
  2. Für die reguläre Form: Bestimmen Sie die Anzahl der Bruchstellen, die in die gewünschte Breite passen. Konstruieren Sie die Formatzeichenfolge entsprechend mit Sprintf, um sowohl die Breite als auch die Genauigkeit anzugeben.
  3. Überprüfen Sie für die wissenschaftliche Notation die Breite des Exponenten (z. B. e 1, e 10, e 100) und berechnen Sie die maximal mögliche Genauigkeit für den Bruch Teil innerhalb der verbleibenden Breite.

Hier ist eine Beispielimplementierung in Los:

import (
    "fmt"
)

func format12(x float64) string {
    if x >= 1e12 {
        exp := fmt.Sprintf("%.g", x)
        return fmt.Sprintf("%%12.%dg", 12-len(exp))
    }
    s := fmt.Sprintf("%.0f", x)
    if len(s) == 12 {
        return s
    }
    return fmt.Sprintf("%%%d.%df", len(s), 12-len(s)-1)
}

Das Testen dieser Funktion mit verschiedenen float64-Werten ergibt die folgende Ausgabe:

0.0000000000
0.1234567890
1234.5678901
123456789012
1.234568e+12
9405090880.5
9.405091e+19
9.40509e+119

Dies zeigt, wie float64-Zahlen in einer festen Breite mit der maximal möglichen Anzahl von Signifikanten gedruckt werden Ziffern mit benutzerdefinierter Formatierung.

Das obige ist der detaillierte Inhalt vonWie drucke ich Float64-Zahlen in Go mit fester Breite und maximaler signifikanter Ziffer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn