2012-07-24 4 views
0

변수는 직접 입력 (즉 (5.00, 20.00)를 완벽하게 변화를 계산하지만 구매로 값을 대체하고 금액 경우 변경 사항을 계산하지 않는 이유는 무엇입니까?자바 대입 변수

public static void makeChange() 
    { 

     double purchase; 
     double tendered; 

     Scanner scan = new Scanner (System.in); 

     System.out.println ("How much was the Purchase?"); 
     purchase = scan.nextDouble(); 
     System.out.println ("Amount Tendered"); 
     tendered = scan.nextDouble(); 


     System.out.println("Processing Transaction"); 
     int ch[] = cd.makeChange(purchase, tendered); // does not calculate change correctly 





      ...continued 
+1

오류가 발생합니까 아니면 잘못된 결과입니까? 'makeChange (double, double)'메소드를 보여줄 수 있습니까? – Keppil

+0

그냥 잘못된 결과, 모든 것이 0으로 밝혀졌습니다. –

+2

'purchase'와'tendered'를 출력하여 여러분이 생각하는 값을 포함하고 있는지보십시오. – Keppil

답변

3

하는 경우 당신은 어떤 중간 값은 정확하게 double로 표현할 수없는 수를되는 즉시 예측할 수없는 결과를 얻을 수있는 double를 사용하여를 arithmetics와 비교를 사용하는 예를 들어,이 무고한 보이는 루프 고려하십시오.

double value = 1.0; 
double dime = 0.1; 
while (value > 0) { 
    value -= dime; 
    System.out.println(value); 
} 

티 의 인쇄 :

0.9 
0.8 
0.7000000000000001 
0.6000000000000001 
0.5000000000000001 
0.40000000000000013 
0.30000000000000016 
0.20000000000000015 
0.10000000000000014 
1.3877787807814457E-16 
-0.09999999999999987 

은 또한 그런 경우 이유에 대해 읽기는 여기에서 찾을 수 있습니다 : What Every Computer Scientist Should Know About Floating-Point Arithmetic.

이전 질문에서 제안한 것처럼 double 변수를 BigDecimal으로 변경하면 문제가 해결 될 것이라고 생각합니다.

+0

나는 그 기사, 고마워 할 것이다. –

+0

BigDecimal이 식별자로 작동하지 않는 이유가 있습니까? –

+1

어떤 방식으로 작동하지 않습니까? 당신의 프로그램은'BigDecimal's로 작동해야합니다, 당신의'Scanner'를위한'nextBigDecimal()'메소드가 있습니다. – Keppil