Heim  >  Artikel  >  Backend-Entwicklung  >  Umgang mit Währungen in Golang und anderen Programmiersprachen

Umgang mit Währungen in Golang und anderen Programmiersprachen

PHPz
PHPzOriginal
2024-07-18 01:21:31747Durchsuche

Handling Currency In Golang And Other Programming Language

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.

Präzision und Genauigkeit

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:

  • shopspring/decimal
  • ericlagergren/dezimal
  • Alpacahq/Alpacadecimal
  • govalues/decimal

Danke an kennfatt für die Kuratierung dieser Bibliotheksliste

Bibliothek auswählen

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

1. Genauigkeit und Präzision

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.

2. Benutzerfreundlichkeit

Die Bibliothek sollte über eine klare und umfassende Dokumentation verfügen. Es sollte sich leicht in Ihre bestehende Codebasis und Arbeitsabläufe integrieren lassen.

3. Leistung

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.

4. Funktion

Stellen Sie sicher, dass die Funktionen Ihren Anforderungen entsprechen, von Grundrechenarten wie Rundung, Addition, Subtraktion, Multiplikation, Division bis hin zu komplexeren mathematischen Operationen.

5. Gemeinschaft und Support

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.

Verwendung von Drittanbietern

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.

Speichern und Abrufen

Auch die Speicherung in Datenbanken erfordert sorgfältige Überlegungen, um Präzision und Konsistenz zu gewährleisten.

Verwenden Sie geeignete Spaltentypen

Die meisten relationalen Datenbanken verfügen über spezielle Typen für Währungswerte, z. B. DECIMAL oder NUMERIC.

Vermeiden Sie Gleitkommaspeicher

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)
);

Vollständige MySQL-Demonstration in Go

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

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

Conclusion

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.

External Link

  • Full Code Example
  • govalues/decimal Repo
  • shopspring/decimal Repo
  • ericlagergren/decimal Repo
  • alpacahq/alpacadecimal Repo

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!

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