2017-05-18 2 views
2

몇 년 전에 저는 돈과 보험을 다루는 응용 프로그램을 작성하는 것을 도왔습니다. 처음에는 부동 소수점 숫자로 돈을 나타 냈습니다 (큰 노 - 아, 알아요). 대부분의 응용 프로그램은 값을 더하거나 뺄 때만 사용되었으므로 아무런 문제가 없었습니다. 그러나 특정 부분은 돈 가치의 비율, 따라서 곱셈과 나눗셈을 다룹니다.정수/BigInteger 대 BigDecimal을 나타내는 돈

우리는 즉시 부동 소수점 오류로 고통 받기 시작했고 주요 리펙터를해야했습니다. 우리는 그 문제를 해결 한 임의의 정밀도 라이브러리를 사용했습니다. 그러나 그것은 당신이 센트의 1 센트로 끝날 수 있다는 사실을 바꾸지 않았습니다. 네가 어떻게 돌릴 수 있니? 짧은 대답은 "it's complicated"입니다.

이제 이전 응용 프로그램을 대체하기 위해 비슷한 응용 프로그램에서 작업을 시작할 준비가되었습니다. 나는 이것을 몇 년 동안 둘러 보았습니다. 필자는 항상 정수 (또는 BigInteger)를 래핑하여 화폐 수를 나타내는 전통적인 돈형 데이터 유형을 생성하는 것이 가장 편리하다고 생각했습니다. 이는 인간에게 친숙한 전통적인 $0.00 형식으로 인쇄하는 기능이 있습니다.

그러나 이것을 조사한 결과 최근에 구현 된 Java Money API 인 JSR 354이 발견되었습니다. 나는 그 돈이 BigDecimal이라는 표현으로 뒷받침된다는 사실에 놀랐다. 그 때문에 반올림을위한 특정 논리가 포함됩니다.

계산에서 1 센트의 분수를 휴대하는 것이 이점은 무엇입니까? 왜 나는 1 센트가 돈의 "원자"형태라고 말하는 대신 그것을하고 싶습니까?

+0

아니므로 나는 오늘 분수 센트 가격의 물건을 샀다. – EJP

+0

[millage rates] (http://www.investopedia.com/terms/m/millagerate.asp?lgl=myfinance-layout)에 익숙합니까? 또는 [휘발유] 가격 (http://www.nacsonline.com/YourBusiness/FuelsReports/GasPrices_2013/Pages/Why-Is-Gas-Priced-Using-Fractions.aspx)? –

답변

4

응답의 구현이 다른 이유로 광범위한 질문입니다.

$ 5에 대해 대량으로 1000 개의 항목을 구매한다면 각 항목은 개별적으로 $ 0.005의 비용을 지불하게됩니다. 이는 귀하가 "원자재"인 0.01 달러라고 주장하는 것보다 적습니다.

$ 0.01를 가능한 한 최소 금액으로 간주하면 예제와 같은 특정 상황에서 계산을 처리 할 수 ​​없습니다.

그런 이유로 JavaMoney API는 많은 소수 자릿수를 처리하므로 이와 같은 경우에는 정밀도가 손실되지 않습니다.