2016-08-30 3 views
-1

는 :2 BigDecimal 간의이 비교가 실패하는 이유는 무엇입니까? 다음과 같은 상황을 포함 I는 단위 테스트를 자바 응용 프로그램에

BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal(2.85000); 
BigDecimal rendimentoLordoProvvisiorioDB = null; 

rendimentoLordoProvvisiorioDB = pucManager.getRendimentoLordoProvvisorio(date); 

assertTrue(rendimentoLordoProvvisiorioExpected.compareTo(rendimentoLordoProvvisiorioDB) == 0); 

의 값이 변수가 수동으로 rendimentoLordoProvvisiorioDB2.85000에 걸렸고 얻어진 값이다 rendimentoLordoProvvisiorioExpected은 2.85000입니다 .

문제는 그 나는()의 JUnit 함수 assertTrue에이을 비교 한을 수행 할 때

assertTrue(rendimentoLordoProvvisiorioExpected.compareTo(rendimentoLordoProvvisiorioDB) == 0); 

은 2.85000 잘 살고 (로 2.850000000000000088817841970012523233890533447265625이 아닌 것 같다 rendimentoLordoProvvisiorioExpected 때문에 실패).

왜? 이전 코드를 수정하여 렌더링 휘도 좌표 값 예상 값을 예상 값 으로 설정하려면 어떻게합니까?

+3

정확하지 않은 double을 사용하여'rendimentoLordoProvvisiorioExpected'를 초기화합니다. 대신 String을 사용하여 초기화하십시오. – hotzst

+1

왜 내가 'BigDecimal (double)'의 JavaDoc을 읽지 않은지 궁금합니다 (https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal -더블-). 그것은'double'이 당신이 사용해야하는 것이 정확하지 않다는 것을 알려줍니다. – Tom

답변

4

Double을 사용하여 생성자를 호출하여 부동 소수점 값으로 BigDecimal을 초기화하기 때문에. double은 부동 소수점 숫자입니다. 문자열 사용 :

BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000"); 

documentation of BigDecimal regarding calling the double version of the constructor을 읽어야합니다.

BigDecimal을 사용하면 기본 2 부동 소수점을 기본 10 부동 소수점 숫자로 변환합니다. 당신은 예를 What Every Programmer Should Know About Floating-Point Arithmetic를 들어, 부동 소수점에 대한 자세한 내용을 읽어야

>>> decimal.Decimal(2.85) 
Decimal('2.850000000000000088817841970012523233890533447265625') 

: 수 2.85의 더 완벽한 두 개의 부동 소수점 표현이 없습니다, 가장 좋은 근사치에 가까운 숫자를 것으로 보인다.

6

BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal(2.85000); 대신 BigDecimal rendimentoLordoProvvisiorioExpected = new BigDecimal("2.85000");을 사용하십시오. Double에서 BigDecimal을 작성하고 복식이 정확하지 않습니다.

+0

메모가 정확한지는 무엇을 의미합니까? 근사치입니까? 아니면 무엇입니까? – AndreaNobili

+1

@AndreaNobili Research .... http://stackoverflow.com/questions/588004/is-floating-point-math-broken – Tom

+0

Double을 사용하여 BigDecimal 생성자를 호출하기 때문에. double은 부동 소수점 숫자입니다. 그래서 문자열을 사용해야합니다. – vz0