Golang およびその他のプログラミング言語での通貨の処理

PHPz
リリース: 2024-07-18 01:21:31
オリジナル
721 人が閲覧しました

Handling Currency In Golang And Other Programming Language

プログラミング言語での通貨の処理は、特に金融取引、電子商取引、銀行取引、および会計システムを扱うアプリケーションにとって、ソフトウェア開発の重要な側面です。通貨価値の正確な表現と操作は、重大な財務上の不一致につながる可能性のあるエラーを回避するために不可欠です。

この記事では、Go 言語の例を使用して通貨処理のベスト プラクティスを探ります。

精度と精度

通貨を扱う際の主な懸念事項の 1 つは精度です。丸め誤差が生じる可能性がある浮動小数点数とは異なり、通貨値は正確な表現を必要とします。

次のコードを検討してください

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)

}

ログイン後にコピー

上記のコードは出力されます

3.5999999999999996
ログイン後にコピー

コンピューターのメモリには限りがあるため、Go を含むほとんどのプログラミング言語は、32 ビットまたは 64 ビットを使用して IEEE-754 標準に基づいて浮動小数点を格納します。64 ビット精度を使用しても、無限の桁数を格納することは不可能です。数値はある時点で四捨五入されるため、本質的に不正確になり、計算が実行されるほど不正確になります。

この問題を処理するには、サードパーティのライブラリを使用するか、使用するプログラミング言語がネイティブ サポートを備えているなど、さまざまな方法があります。 Go には、以下を含むいくつかのライブラリがあります:

  • ショップスプリング/10 進数
  • エリクラゲルグレン/10進数
  • アルパカク/アルパカデシマル
  • govalues/10 進数

このライブラリ リストの監修については kennfatt の功績です

ライブラリの選択

通貨プログラミングを処理するための適切なライブラリを選択するには、いくつかの考慮事項が必要です。これは、ニーズに合わせて適切な 10 進数ライブラリを選択するためのガイドです

1. 精度と精度

ライブラリが要件に合った精度と精度をサポートしていることを確認してください。非常に大きな数値や非常に正確な計算を扱う場合は、任意精度機能を探してください。

2. 使いやすさ

ライブラリには明確で包括的なドキュメントが必要です。既存のコードベースやワークフローと簡単に統合できるはずです。

3. パフォーマンス

特に多数の計算を実行している場合、または高頻度の取引環境で運用している場合は、パフォーマンスへの影響を考慮してください。

4. 特徴

四捨五入、加算、減算、乗算、除算などの基本的な算術演算から、より複雑な算術演算まで、機能がニーズに合っていることを確認してください。

5. コミュニティとサポート

活発なコミュニティがあり、サポートが充実しているライブラリは、ヘルプを得たり、問題の解決策を見つけたりするために非常に重要です。 積極的に保守および更新されているライブラリを探してください。

サードパーティの使用

ドキュメントがシンプルで読みやすく、コードのデモンストレーションのニーズに適しているため、この記事ではコード例としてサードパーティ ライブラリ govalues/decim を使用します

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

}
ログイン後にコピー

上記のコードは出力されます

3.6
ログイン後にコピー

上記の例では精度の損失はありませんが、メモリにはコストがあり、無限ではないため、小数点以下の桁は依然として制限されており、小数点の桁を制御することが重要です。この例では、 decimal.ParseExact() を使用してサイズを設定できます。

保存と取得

データベースに保存するには、精度と一貫性を維持するために慎重な考慮も必要です。

適切な列タイプを使用する

ほとんどのリレーショナル データベースには、DECIMAL や NUMERIC などの通貨値の特定の型があります。

浮動小数点ストレージを避ける

プログラミングと同様に、通貨の値を浮動小数点数としてデータベースに保存することは避けてください。

MySQL の場合

CREATE TABLE `users` (
    `id` int,
    `balance` decimal(6, 2)
);
ログイン後にコピー

Go での完全な MySQL デモ

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

ログイン後にコピー

上記のコードは

を生成します
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

以上がGolang およびその他のプログラミング言語での通貨の処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!