통화에 어떤 데이터 유형을 사용해야 합니까?
처럼 보입니다.Money
여기에 설명된 대로 유형은 권장되지 않습니다.
응용 프로그램에서 통화를 저장해야 하는데 어떤 데이터 유형을 사용해야 합니까?숫자, 돈 또는 FLOAT?
당신의 출처는 결코 공식적이지 않습니다.그것은 2011년으로 거슬러 올라가며 저는 심지어 작가들을 알아보지도 못합니다.금전 유형이 공식적으로 "낙심" Postgre인 경우SQL은 설명서에 그렇게 나와 있지만 실제로는 그렇지 않습니다.
좀 더 공식적인 출처에 대해서는 D'Arcy J.M. Cain(화폐 유형의 원작자)과 Tom Lane을 포함한 핵심 개발자들의 진술과 함께 pgsql-general의 이 스레드를 읽어 보십시오.
최근 릴리스의 개선 사항에 대한 관련 답변(및 의견!):
기본적으로 (매우 제한적인) 용도가 있습니다.Postgres Wiki는 좁게 정의된 경우를 제외하고는 대부분 이를 피하라고 제안합니다.보다 유리한 점numeric
성능입니다.
decimal
는 Postgres의 별칭일 뿐이며, "임의의 정밀도" 유형으로 금전적 데이터에 널리 사용됩니다.설명서:
numeric
숫자를 매우 많은 숫자로 저장할 수 있습니다.특히 정확성이 요구되는 경우 금전적 금액 및 기타 수량을 저장하는 것이 좋습니다.
개인적으로, 저는 분수 센트가 발생하지 않는다면 (기본적으로 돈이 의미 있는 곳에서) 센트를 나타내는 것으로 화폐를 저장하는 것을 좋아합니다.그것은 언급된 다른 옵션보다 더 효율적입니다.
강제 2단위 정밀도의 숫자입니다.통화를 표현하기 위해 데이터 유형과 같은 유동성 또는 유동성을 사용하지 마십시오. 그렇게 하면 재무 보고서의 수익 수치가 + 또는 - 몇 달러 틀리면 사람들이 불행해질 것입니다.
돈의 종류는 제가 아는 한 역사적인 이유로 그냥 남겨져 있습니다.
예를 들어 1 이란 리알은 0.000030 미국 달러와 같습니다.5자리 이하의 분수를 사용하는 경우 1 IRR은 변환 후 0USD로 반올림됩니다.여기서 재판을 하는 건 알지만, 돈을 다룰 때는 절대 안전할 수 없다고 생각해요.
선택할 수 있는 항목:
bigint
금액을 센트 단위로 저장합니다.이것은 EFTPOS 트랜잭션이 사용하는 것입니다.decimal(12,2)
소수점 두 자리로 정확하게 양을 저장합니다.이것은 대부분의 일반 원장 소프트웨어가 사용하는 것입니다.float
끔찍한 아이디어 - 부적절한 정확성.이것이 순진한 개발자들이 사용하는 것입니다.
옵션 2는 가장 일반적이고 사용하기 쉬운 옵션입니다.정확도(이 예에서는 12자리, 모두 12자리를 의미)를 사용자에게 가장 적합한 크기 또는 작은 크기로 만듭니다.
: 의미가 값을 하려면 정밀도가 더 . 예를 들어 "(": ") " " " " " (" " ") " " " " "와 같은 하는 것을 해 보십시오. 다음과 같은 것을 사용하는 것을 고려해 보십시오.decimal(18, 8)
따라서 합계는 정확하며 개별 값은 표시를 위해 센트 정밀도로 반올림할 수 있습니다.
를 64비트로 합니다.bigint
센트가 충분히 세분화되지 않은 경우 작은 통화 단위(센트)에 저장하거나 큰 승수를 사용하여 더 큰 정수를 만듭니다.저는 달러를 100만 달러로 나누는 마이크로 달러 같은 것을 추천합니다.
예:$5,123.56
로 저장할 수 있습니다.5123560000
마이크로 달러
- 사용이 간편하고 모든 언어와 호환됩니다.
- 1센트의 분수를 다룰 수 있는 충분한 정밀도.
- 매우 적은 단위당 가격(예: 광고 인상 또는 API 요금)으로 작동합니다.
- 저장할 데이터 크기가 문자열이나 숫자보다 작습니다.
- 계산을 통해 정확도를 유지하고 최종 출력 시 반올림을 적용하기 쉽습니다.
나는 나의 모든 자금 분야를 다음과 같이 유지합니다.
numeric(15,6)
소수점 이하의 자리가 그렇게 많은 것은 과도한 것 같지만, 조금이라도 가능성이 있다면 여러 개의 통화를 처리해야 할 것입니다. 변환을 위해서는 그만큼의 정밀도가 필요할 것입니다.사용자에게 어떤 정보를 제공하든 저는 항상 US 달러를 저장합니다.관련된 당일의 환율을 고려할 때, 저는 다른 통화로 쉽게 전환할 수 있습니다.
만약 여러분이 단 하나의 화폐만을 사용하지 않는다면, 여기서 가장 나쁜 것은 여러분이 0을 저장하기 위해 약간의 공간을 낭비했다는 것입니다.
사용하다BigInt
통화를 가장 작은 통화 단위로 화폐 가치를 나타내는 양의 정수로 저장(예: 100센트는 1.00달러를 저장하거나 100엔(일본 엔화, 0진수 통화)을 저장).이것이 바로 스트라이프가 하는 일입니다. 글로벌 전자 상거래에서 가장 중요한 금융 서비스 회사 중 하나입니다.
출처: https://stripe.com/docs/currencies 에서 "0-십진수 통화"를 참조하십시오.
결국 이것이 최고의 답이 될 것입니다...
이것은 직접적인 대답이 아니라, 왜 그런지에 대한 예입니다.float
통화에 가장 적합한 데이터 형식이 아닙니다.
부동 소수점이 내부적으로 표시되는 방식 때문에 오차 반올림에 더 취약합니다.
우리의 십진법에서는, 여러분이 10의 계수인 2나 5를 제외한 다른 것으로 나눌 때마다 오류를 반올림할 것입니다.이진법에서는 2이고 5가 아니기 때문에 다음과 같은 "깨끗한" 소수도 있습니다.0.2
(1/5)이 위험에 처해 있습니다.
다음을 시도하면 이 메시지를 볼 수 있습니다.
select
0.1::float + 0.2::float as floats, -- 0.30000000000000004
0.1::numeric + 0.2::numeric as numerics --- 0.3
;
그것이 감사자들을 궁지로 몰아넣는 것입니다.
제 개인적인 추천은 당신의 필요에 따라 정확하게 십진법으로 되어 있습니다.소수 통화 단위(예: 센트)의 정수를 저장하고 프로그래밍 언어로 소수를 처리하는 데 문제가 있는 경우 정밀도가 = 0인 10진수가 옵션이 될 수 있습니다.
필요한 정밀도를 확인하려면 다음 사항을 고려해야 합니다.
- 지원하는 통화 유형(소수점 수가 다를 수 있음).암호화폐에는 최대 18자리 숫자(ETH)가 있습니다.소수점 이하의 수는 인플레이션으로 인해 시간이 지남에 따라 변할 수 있습니다.
- 상품의 작은 단위의 가격을 저장하거나(아마도 다른 통화의 전환으로 인한 것일 수 있음) 축적기(1센트 거래에서 1센트가 될 때까지 10% 수수료를 누적) 보유하려면 통화에 대해 정의된 것보다 더 많은 소수를 사용해야 할 수 있습니다.
- 정밀도를 변경해야 하는 경우 최소 단위의 정수 수를 저장하면 나중에 값의 크기를 조정해야 할 수 있습니다.십진법을 사용하면 훨씬 쉽습니다.
또한 사용하는 프로그래밍 언어에서 해당 데이터 유형을 찾아야 합니다.
자세한 내용 및 주의 사항은 기사에 나와 있습니다.
언급URL : https://stackoverflow.com/questions/15726535/which-datatype-should-be-used-for-currency
'programing' 카테고리의 다른 글
리스트의 표준 편차 (0) | 2023.05.25 |
---|---|
서비스 패브릭에 대한 환경별 런타임 구성 매개 변수를 설정하고 액세스하는 위치는 무엇입니까? (0) | 2023.05.25 |
Eclipse IDE에서 창/뷰를 분할 및 분할 해제하는 방법은 무엇입니까? (0) | 2023.05.20 |
호출 한 번으로 객체 배열을 몽구스의 배열로 푸시하는 방법은 무엇입니까? (0) | 2023.05.20 |
iOS 7에서 UITableView 구분자를 수정하는 방법은 무엇입니까? (0) | 2023.05.20 |