Golang 및 기타 프로그래밍 언어로 통화 처리

PHPz
풀어 주다: 2024-07-18 01:21:31
원래의
763명이 탐색했습니다.

Handling Currency In Golang And Other Programming Language

프로그래밍 언어로 통화를 처리하는 것은 소프트웨어 개발, 특히 금융 거래, 전자 상거래, 금융 및 회계 시스템을 다루는 애플리케이션의 경우 중요한 측면입니다. 심각한 재정적 불일치로 이어질 수 있는 오류를 방지하려면 통화 가치를 정확하게 표시하고 조작하는 것이 필수적입니다.

이 기사에서는 Go 언어의 예시를 통해 통화 처리 모범 사례를 살펴보겠습니다.

정밀도와 정확성

화폐를 다룰 때 가장 중요하게 생각하는 것 중 하나는 정확성입니다. 반올림 오류가 발생할 수 있는 부동 소수점 숫자와 달리 통화 값은 정확한 표현이 필요합니다.

다음 코드를 고려하세요

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
로그인 후 복사

컴퓨터의 메모리는 제한되어 있기 때문에 32비트 또는 64비트를 사용하는 IEEE-754 표준 기반의 Go 저장 부동 소수점을 포함한 대부분의 프로그래밍 언어는 64비트 정밀도를 사용해도 무한한 자릿수를 저장하는 것이 불가능합니다. 숫자는 어느 시점에서 반올림되어 본질적으로 부정확해지며, 계산을 많이 할수록 부정확해집니다.

타사 라이브러리를 사용하거나 사용하는 프로그래밍 언어가 기본적으로 지원되는 등 이 문제를 처리하는 방법은 많습니다. Go에는 다음을 포함한 여러 라이브러리가 있습니다.

  • shopspring/십진수
  • 에리클라거그렌/십진수
  • alpacahq/alpacadecimal
  • 고값/소수

이 라이브러리 목록을 관리한 kennfatt에게 감사드립니다

도서관 선택

통화 프로그래밍 처리에 적합한 라이브러리를 선택하려면 몇 가지 고려 사항이 필요합니다. 귀하의 필요에 맞는 적절한 십진 라이브러리를 선택하는 데 도움이 되는 가이드는 다음과 같습니다

1. 정확성과 정밀성

라이브러리가 귀하의 요구 사항에 맞는 정밀도와 정확성을 지원하는지 확인하세요. 매우 큰 숫자나 매우 정확한 계산을 처리하는 경우 임의 정밀도 기능을 찾으십시오.

2. 사용 편의성

도서관에는 명확하고 포괄적인 문서가 있어야 합니다. 기존 코드베이스 및 워크플로와 통합하기 쉬워야 합니다.

3. 성능

특히 대량 계산을 수행하거나 빈도가 높은 거래 환경에서 운영하는 경우 성능에 미치는 영향을 고려하세요.

4. 특징

반올림, 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 기본 산술부터 보다 복잡한 수학 연산에 이르기까지 기능이 귀하의 요구에 맞는지 확인하세요.

5. 커뮤니티 및 지원

활발한 커뮤니티와 잘 지원되는 도서관은 도움을 받고 문제에 대한 해결책을 찾는 데 매우 중요할 수 있습니다. 적극적으로 유지관리되고 업데이트되는 라이브러리를 찾아보세요.

타사 사용

문서가 간단하고 읽기 쉽고 코드 데모의 필요성에 적합하므로 이 기사에서는 코드 예제로 타사 라이브러리 govalues/decimal을 사용합니다.

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
로그인 후 복사

위의 예에서는 정밀도 손실이 없지만 메모리에는 비용이 들고 무한하지 않기 때문에 소수점 이하 자릿수는 여전히 제한되어 있으므로 소수점 자릿수를 제어하는 ​​것이 중요합니다. 이 예에서는 십진수.ParseExact()를 사용하여 크기를 설정할 수 있습니다.

저장 및 검색

데이터베이스에 저장할 때도 정확성과 일관성을 유지하기 위해 신중한 고려가 필요합니다.

적절한 열 유형 사용

대부분의 관계형 데이터베이스에는 DECIMAL 또는 NUMERIC과 같은 특정 통화 값 유형이 있습니다.

부동 소수점 저장을 피하세요

프로그래밍과 마찬가지로 데이터베이스에 통화 값을 부동 소수점 숫자로 저장하지 마세요.

예를 들어 MySQL의 경우

CREATE TABLE `users` (
    `id` int,
    `balance` decimal(6, 2)
);
로그인 후 복사

전체 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿