プログラミング言語での通貨の処理は、特に金融取引、電子商取引、銀行取引、および会計システムを扱うアプリケーションにとって、ソフトウェア開発の重要な側面です。通貨価値の正確な表現と操作は、重大な財務上の不一致につながる可能性のあるエラーを回避するために不可欠です。
この記事では、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 には、以下を含むいくつかのライブラリがあります:
このライブラリ リストの監修については kennfatt の功績です
通貨プログラミングを処理するための適切なライブラリを選択するには、いくつかの考慮事項が必要です。これは、ニーズに合わせて適切な 10 進数ライブラリを選択するためのガイドです
ライブラリが要件に合った精度と精度をサポートしていることを確認してください。非常に大きな数値や非常に正確な計算を扱う場合は、任意精度機能を探してください。
ライブラリには明確で包括的なドキュメントが必要です。既存のコードベースやワークフローと簡単に統合できるはずです。
特に多数の計算を実行している場合、または高頻度の取引環境で運用している場合は、パフォーマンスへの影響を考慮してください。
四捨五入、加算、減算、乗算、除算などの基本的な算術演算から、より複雑な算術演算まで、機能がニーズに合っていることを確認してください。
活発なコミュニティがあり、サポートが充実しているライブラリは、ヘルプを得たり、問題の解決策を見つけたりするために非常に重要です。 積極的に保守および更新されているライブラリを探してください。
ドキュメントがシンプルで読みやすく、コードのデモンストレーションのニーズに適しているため、この記事ではコード例としてサードパーティ ライブラリ 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) );
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 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.
以上がGolang およびその他のプログラミング言語での通貨の処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。