2017-11-27 22 views
0

흥미로운 문제가 발생했습니다. 나는 햄버거를 판매하는 응용 프로그램을 만들고 있습니다. 지금까지 JUnit의 테스트가 통과되었습니다. 그러나 jUnit의 결과가 실제로 같은 번호의 인쇄 된 버전과 일치하지 않는다는 것을 알았습니다.검증 된 테스트의 double이 out.prinln 버전과 일치하지 않습니다.

또한 계산 결과는 매우 단순한 복식을 더하고 빼는 것과 같은 간단한 작업에서 비롯된 것입니다. 11.90 대신 11.8999999999? 시험 방법

Income so far is 11.899999999999999. Transaction value: 11.899999999999999 
Income so far is 20.9. Transaction value: 9.0 

테스트 방법

public void completeTransaction(){ 
    double value = 0.0; 
    for(Burger product : this.transaction.keySet()){ 
     for(int i=0; i<(int)(this.transaction.get(product)); i++){ 
      double price = calculateBurgerPrice(product); 
      this.income += (double) price; 
      value += price; 
      this.soldBurgers += 1; 
     } 
    } 
    System.out.println("Income so far is " + getIncome() + ". Transaction 
    value: " + value); 
    this.processedTransactions += 1; 
} 

는 감사의

@Test 
public void canGenerateAndCountProccessedTransactions2(){ 
    till1.newTransaction(); 
    till1.addProduct(burger1);//3.00 
    till1.addProduct(burger2);//4.60 
    till1.addProduct(burger3);//4.30 
    till1.completeTransaction(); 
    assertEquals(11.90, till1.getIncome(), 0.1); 
    till1.newTransaction(); 
    till1.addProduct(burger1);//3.00 
    till1.addProduct(burger1);//3.00 
    till1.addProduct(burger1);//3.00 
    till1.completeTransaction(); 
    assertEquals(20.90, till1.getIncome(), 0.1); 
    assertEquals(2, till1.numOfProcessedTransactions()); 
} 

인쇄 결과를 전달

테스트 파일!

+0

11.90 이중와 ​​비트의 유한 수에 표시 할 수 없습니다. 이는 부동 소수점 값이 (음수) 2의 합이기 때문입니다. 하나는'new BigDecimal ("11.90")'에서와 같이 BigDecimal을 사용하거나 반올림 및 반올림을 계속해야합니다. –

+0

나는 그것에 대해 더 자세히 읽을 필요가있다. 나는 그것을 줄 것이다! 감사합니다 :) – bwielk

+0

'assertEquals (20.90, till1.getIncome(), 0.1)'에는 매우 큰 델타가 있습니다. 그것은 당신이 정말로 소수점 뒤에 첫 번째 자릿수에 대해서 신경 쓰지 않는다는 것을 의미합니다. 그것은 1.25와 1.5를 동일하게 취급 할 것입니다. 어설 션이 실패하지 않고도 작게 만들 수 있습니다. –

답변

0

작은 정밀도로 설정할 수있는 정밀도가 있으므로 일치합니다. 당신은 오히려 정밀도 두 배의 둘레에 당신이 필요로한다 (예를 들어 1E-2) 및 인쇄하는 것이 아니라 (검증되지 않은) 이중 자체보다 :

System.out.println("Income so far is %.2f. Transaction value: %.2f", getIncome(), value); 
+0

테스트에서 작은 정밀도를 사용할 수도 있습니다. 당신은 $ 0.10 여분을 지불하고 싶지 않을 것이다 :) – Dummy101

+0

나는 그 해결책을 시도 할 것이다 그러나 나는 아직도 어떻게 얻지 않을 것이다 3.30 + 5.30는 8.60 대신에 8.599999999999999999999999 일 수 있었다 : – bwielk

+1

그것은 전에 제안 되었기 때문에, 무엇에 관하여 더 많은 것을 읽으십시오 정확히 두 배이며 어떻게 숫자가 부동 소수점으로 표현됩니까? – Dummy101