Heim >Backend-Entwicklung >Golang >Umgang mit Währungen in Golang und anderen Programmiersprachen
Der Umgang mit Währungen in Programmiersprachen ist ein entscheidender Aspekt der Softwareentwicklung, insbesondere für Anwendungen, die sich mit Finanztransaktionen, E-Commerce, Bank- und Buchhaltungssystemen befassen. Eine genaue Darstellung und Manipulation von Währungswerten ist unerlässlich, um Fehler zu vermeiden, die zu erheblichen finanziellen Diskrepanzen führen können.
In diesem Artikel werden Best Practices im Umgang mit Währungen anhand eines Beispiels in Go-Sprachen untersucht.
Eines der Hauptanliegen beim Umgang mit Währungen ist die Präzision. Im Gegensatz zu Gleitkommazahlen, die zu Rundungsfehlern führen können, erfordern Währungswerte eine präzise Darstellung.
Erwägen Sie den folgenden Code
package main import "fmt" func main() { var a float64 = 1.1 var b float64 = 1.2 var c float64 = 1.3 fmt.Println(a + b + c) }
Der obige Code würde gedruckt werden
3.5999999999999996
Da der Speicher von Computern begrenzt ist, speichern die meisten Programmiersprachen, einschließlich Go, Gleitkommazahlen basierend auf dem IEEE-754-Standard mit 32 oder 64 Bit. Selbst mit 64-Bit-Präzision ist es unmöglich, eine unendliche Anzahl von Ziffern zu speichern, was bedeutet, dass diese nicht möglich sind Zahlen werden irgendwann gerundet, was sie von Natur aus ungenau macht, und je mehr Berechnungen durchgeführt werden, desto ungenauer werden sie.
Es gibt viele Möglichkeiten, dieses Problem zu lösen, z. B. die Verwendung einer Bibliothek eines Drittanbieters oder die von Ihnen verwendete Programmiersprache bietet native Unterstützung. In Go gibt es mehrere Bibliotheken, darunter:
Danke an kennfatt für die Kuratierung dieser Bibliotheksliste
Die Auswahl der richtigen Bibliothek für die Währungsprogrammierung erfordert mehrere Überlegungen. Hier ist eine Anleitung, die Ihnen bei der Auswahl einer geeigneten Dezimalbibliothek für Ihre Anforderungen hilft
Stellen Sie sicher, dass die Bibliothek Präzision und Genauigkeit unterstützt, die Ihren Anforderungen entsprechen. Suchen Sie nach Funktionen zur willkürlichen Genauigkeit, wenn Sie mit sehr großen Zahlen oder sehr präzisen Berechnungen arbeiten.
Die Bibliothek sollte über eine klare und umfassende Dokumentation verfügen. Es sollte sich leicht in Ihre bestehende Codebasis und Arbeitsabläufe integrieren lassen.
Berücksichtigen Sie die Auswirkungen auf die Leistung, insbesondere wenn Sie eine große Anzahl von Berechnungen durchführen oder in einer Hochfrequenzhandelsumgebung tätig sind.
Stellen Sie sicher, dass die Funktionen Ihren Anforderungen entsprechen, von Grundrechenarten wie Rundung, Addition, Subtraktion, Multiplikation, Division bis hin zu komplexeren mathematischen Operationen.
Eine gut unterstützte Bibliothek mit einer aktiven Community kann entscheidend sein, um Hilfe zu erhalten und Lösungen für Probleme zu finden. Suchen Sie nach Bibliotheken, die aktiv gepflegt und aktualisiert werden.
In diesem Artikel werden govalues/decimal Bibliotheken von Drittanbietern als Codebeispiel verwendet, da das Dokument einfach und leicht zu lesen ist und der Notwendigkeit einer Codedemonstration gerecht wird
package main import ( "fmt" "github.com/govalues/decimal" ) func main() { a, _ := decimal.Parse("1.1") b, _ := decimal.Parse("1.2") c, _ := decimal.Parse("1.3") a, _ = a.Add(b) a, _ = a.Add(c) fmt.Println(a.String()) }
Der obige Code würde gedruckt werden
3.6
Im obigen Beispiel gibt es keinen Präzisionsverlust. Da der Speicher jedoch kostenpflichtig und nicht unendlich ist, sind die Stellen nach dem Dezimalpunkt immer noch begrenzt. Die Kontrolle der Dezimalstelle ist wichtig. In diesem Beispiel können Sie die Größe mit decimal.ParseExact() festlegen.
Auch die Speicherung in Datenbanken erfordert sorgfältige Überlegungen, um Präzision und Konsistenz zu gewährleisten.
Die meisten relationalen Datenbanken verfügen über spezielle Typen für Währungswerte, z. B. DECIMAL oder NUMERIC.
Vermeiden Sie es wie beim Programmieren, Währungswerte als Gleitkommazahlen in Datenbanken zu speichern.
Zum Beispiel in MySQL
CREATE TABLE `users` ( `id` int, `balance` decimal(6, 2) );
package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test") if err != nil { panic(err) } _, err = db.Exec(` CREATE TABLE test ( id int, balance_decimal decimal(16, 8), balance_float float(16, 8), PRIMARY KEY (id) ); `) _, err = db.Exec("INSERT INTO test (id, balance_decimal, balance_float) VALUES (1, 1.1, 1.1)") _, err = db.Exec(` UPDATE test SET balance_decimal = balance_decimal + 1.2 , balance_float = balance_float + 1.2 WHERE id = 1; `) }
Der obige Code würde ergeben
id | balance_decimal | balance_float |
---|---|---|
1 | 2.30000000 | 2.29999995 |
Data transfer also requires careful consideration of precision. a correct format is required
For example in JSON format, using type string guaranteed precision across any programing language
package main import ( "encoding/json" "log" ) type Data struct { Decimal string `json:"decimal"` Float float64 `json:"float"` } func main() { payload := []byte(`{"decimal":"999.99999999999999","float":999.99999999999999}`) result := Data{} _ = json.Unmarshal(payload, &result) log.Print("Decimal: ", result.Decimal) log.Print("Float: ", result.Float) }
Above code would print
Decimal: 999.99999999999999 Float: 1000
Handling currency in programming languages requires careful attention to detail to ensure precision, accuracy, and consistency. By using appropriate data types, libraries, and best practices, developers can avoid common pitfalls and ensure their applications handle currency correctly. Proper handling of currency not only prevents financial errors but also enhances user trust and confidence in the application.
There's no single best library for everyone. Each project has different needs. You should think about what's good and bad about each library based on what your project requires.
Das obige ist der detaillierte Inhalt vonUmgang mit Währungen in Golang und anderen Programmiersprachen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!