2012-09-28 3 views
2

우리는 Ruby 's Money gem을 사용하고 있습니다. 우리의 응용 프로그램에서는 통화 간의 변환도 수행합니다.루비 머니 젬에 가장 적합한 rounding_method는 무엇입니까?

그래서 통화간에 변환 할 때 반올림 문제가 발생합니다. 현재 Ruby에 내장 된 Float#round을 사용하고 있습니다.

그러나 이것은 "매달린 페니"문제를 야기합니다.

Money.new(500,'USD').exchange_to('EUR') 
#=> #Money cents:385 currency:EUR 

Money.new(500,'USD').exchange_to('EUR').exchange_to('USD') 
#=> #Money cents:501 currency:USD 

유로화로 전환 한 다음 5 달러가되면 5.01 달러가됩니다.

{ 
    "GBP_TO_USD"=>1.6, 
    "USD_TO_GBP"=>0.625, 
    "GBP_TO_EUR"=>1.2, 
    "EUR_TO_GBP"=>0.8333333333333334, 
    "EUR_TO_USD"=>1.3, 
    "USD_TO_EUR"=>0.7692307692307692 
} 

이 추가되거나 누락 된 페니의이 문제를 방지하기 위해 반올림 방법을 가질 수 있습니다 :이 우리가 사용하고있는 환율입니까? 그 반올림 방법은 무엇입니까?

또는 수학적으로 해결할 수없는 문제입니까?

답변

2

숫자를 반올림하면 정보가 손실됩니다. 문제를 해결하는 가장 좋은 방법은 어쨌든 돈으로해서는 안되는 반올림을 중단하고 어딘가에서 값을 표시 할 때만 반올림하는 것입니다.

+1

감사합니다. 너의 의도를 알 겠어. 반올림하지 말고, float 값을 저장하는 것을 의미한다고 생각합니다. 그러나 Ruby의 Money gem이 분수 센트 (또는 펜스)를 허용하지 않는다고 생각합니다.

1.9.3-p0 :011 > Money.new(999.99,'USD') => # 
나는 Money 레벨이 아닌 어플리케이션 레벨에서 이것을 해결해야한다고 생각한다. –

+0

체크 표시가 인정 될 것입니다. 내가 정말로 필요로하는 것은 아니지만, 처음에는 이것이 당신의 대답이고, 두 번째는 사람들이 당신에게 대답하도록 동기를 부여한다는 것을 보여줍니다. 내가 대답 할 때 나는 당신의 수용 비율을 보았으나 어쨌든 그것을했다. 비율이 높으면 3 개 이상의 답을 얻었을 것입니다. – CQQL

+0

반올림하지 않는 것이 일반적으로 좋습니다. 그러나 루비 머니 젬의 맥락에서 루비 머니 오브젝트의 정확성은 분수 센트가 아닌 전체 센트만큼 가능하지 않습니다. 생각? –

2

최신 루비 머니 보석은 분수 센트를 지원합니다. 이렇게하면 돈 개체가 다른 통화로 변환되어 다시 자신에게 반환 될 때 해당 값이 유지됩니다. 그래서 실종/추가 센트 문제는 없습니다.

0

"from"과 "to"의 환율이 서로 역이 아니기 때문에 현실 세계에서는 이것이 덜 문제가 될 수 있습니다.

한편, 앞뒤로 변환해야하는 시나리오는 무엇입니까?

[1 USD 2, EUR, 3 개 USD]

그리고이 USD에서 EUR로 환율을 트리거 : 내가 생각할 수있는 유일한 시나리오는 돈의 무리를 합산하는 것은 서로 다른 통화에 객체이다 그리고 USD로 돌아 간다. 이 경우 많은 Money 개체를 합산 할 때 불필요한 통화 교환을 건너 뛰려면 https://github.com/lulalala/money-collection을 시도하십시오.

관련 문제