2017-10-11 2 views
-3

double 값인 Dollar를 Java에서 int 값인 센트로 변환하는 가장 좋은 방법은 무엇입니까? 현재 다음 접근 방식을 사용합니다.Java에서 달러를 센트로 변환하는 가장 정확한 방법은 무엇입니까?

Double cents = new Double(dollar*100); 
int amount = cents.intValue(); 

이 접근 방법의 정확도는 어느 정도입니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

'int amount = (int) (double * 100)'? – geisterfurz007

+3

시작하는 데 'double'값을 사용하지 않는 것이 좋습니다. – khelwood

+0

@khelwood, 지금 나는 dayatypes를 바꿀 수 없다. –

답변

3

값을 두 배로 입력 했으므로 이미 부정확성이 도입되었습니다. 저장 한 숫자와 저장하려는 값이 정확히 일치하지 않을 수 있습니다. 이것에 대처하기 위해 가장 가까운 센트로 반올림하는 것이 좋습니다. 당신은 Math.round으로이 작업을 수행 할 수 있습니다

대부분의 모든과 마찬가지로
int cents = (int) Math.round(100*dollars); 
+2

BigDecimal 아이디어도 사용할 수 있습니다 만, 정수 정밀도와 가장 근처에 둥근 것을 얻는 것은 강제적 인 MathContext뿐입니다. 이것은 훨씬 직접적인 해결책입니다. –

0

, "이 달려있다." 그것은 정확한 상황과 프로그램이 해결하고있는 문제 공간에 달려 있습니다. 부작용에 대한 복식과 수레 방법은 멋지게 보입니다. 그러나 돈의 경우, 많은 사람들과 도서관은 정수 수학만을 사용합니다. 이는 고정밀 성과 높은 정확성이 가장 중요한 경우의 라운딩 오류를 명목상으로 최소화합니다. 자신과 유스 케이스의 효과를 평가하십시오.

한편 생각 프로세스를 자신의 케이스에 적용하면 센트를 사용하고 프레젠테이션 만 변환 할 수 있습니다. 또는 더 나은 아직, 통화 클래스와 아마 USD 클래스의 로직을 캡슐화 :

int amountInCents = .... 
int amountInDollars = round(amountInCents/100.0); 

참고 노골적인 소수의 사용은 정수 나누기를 방지하기 위해 컴파일러에게. 따라서 기민한 코드는이 코드에서 숨겨진 부동 소수점 연산을 볼 수 있습니다.

0

이것은 answer recommending rounding을 지원합니다. 이 프로그램은 질문에서 반올림 한 결과와 잘린 코드를 일련의 값으로 비교합니다. BigDecimal 산술을 사용하여 값을 생성하므로 루프에서 누적 라운딩 오류가 발생하지 않습니다. 반올림 및 절단 결과가 다른 경우 숫자가 인쇄됩니다.

import java.math.BigDecimal; 

public class Test { 
    public static void main(String[] args) { 
    BigDecimal rawDollar = BigDecimal.ZERO; 
    BigDecimal increment = new BigDecimal("0.01"); 
    for (int i = 0; i < 300; i++) { 
     rawDollar = rawDollar.add(increment); 
     double dollar = rawDollar.doubleValue(); 
     Double cents = new Double(dollar * 100); 
     int amount = cents.intValue(); 
     int roundedAmount = (int) Math.round(dollar * 100); 
     if (amount != roundedAmount) { 
     System.out.println("dollar = " + dollar + " amount = " + amount 
      + " rounded = " + roundedAmount); 
     } 
    } 
    } 
} 

다음은 출력물입니다. 인쇄 된 각 사례에서 반올림 한 금액은 정확하고 절단 된 금액은 있어야 할 것보다 1 센트 더 작습니다.

dollar = 0.29 amount = 28 rounded = 29 
dollar = 0.57 amount = 56 rounded = 57 
dollar = 0.58 amount = 57 rounded = 58 
dollar = 1.13 amount = 112 rounded = 113 
dollar = 1.14 amount = 113 rounded = 114 
dollar = 1.15 amount = 114 rounded = 115 
dollar = 1.16 amount = 115 rounded = 116 
dollar = 2.01 amount = 200 rounded = 201 
dollar = 2.03 amount = 202 rounded = 203 
dollar = 2.05 amount = 204 rounded = 205 
dollar = 2.07 amount = 206 rounded = 207 
dollar = 2.26 amount = 225 rounded = 226 
dollar = 2.28 amount = 227 rounded = 228 
dollar = 2.3 amount = 229 rounded = 230 
dollar = 2.32 amount = 231 rounded = 232 
dollar = 2.51 amount = 250 rounded = 251 
dollar = 2.53 amount = 252 rounded = 253 
dollar = 2.55 amount = 254 rounded = 255 
관련 문제