2014-05-13 3 views
1

Oracle 데이터베이스에서 숫자 값을 검색하고 웹 페이지에 표시하는 JSP 웹 응용 프로그램을 실행 중입니다. 수동으로 2929.2의 값을 입력하고 수동으로 데이터베이스에 쿼리하면 해당 값으로 저장되었음을 확인합니다. 하지만 JSP를 통해 검색하면 2929.199951172로 표시됩니다. 어떻게 해결할 수 있습니까? 내가 ResultSets 및 getDouble() 메서드를 사용하고 있습니다. 오라클에 float로 저장되어 있지만, Java double만큼 정밀도가 높다는 내 이해에서 getFloat()는 내가 찾고있는 것이 아닙니다.Oracle 데이터베이스에서 float을 가져올 때 자바 정밀도 문제가 올바르게 반올림되지 않습니다.

BigDecimal에 대한 기사는 다 읽었지만 필자가 필요로하지 않는 한 모든 것을 바꾸는 것을 주저합니다.

+2

글쎄, BigDecimal은 그 목적이 있기 때문에 필요합니다 : 부동 소수점 값에 대한 정확한 정밀도로 데이터베이스의 필드를 처리합니다. –

+0

[BigDecimal] (http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html)을 사용하고 [각 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) (그 내용을 따르지 못할 경우 최소한 [ieee-754 rounding rules] (http : // en.wikipedia.org/wiki/IEEE_floating_point#Rounding_rules)). –

+0

@LuiggiMendoza : getBigDecimal()을 사용할 수 있지만 double로 캐스트하거나 같은 문제가 발생합니까? 나는 내가하고있는 프로그램을 철저히 조사하지 않고 복식을 저장하는 마지막 방법을 바꿀 수 없다. 그리고이 시점에서 나의 상사는 아마 우리 (내부) 고객에게 그것을 말하는 것보다는 그것을 말할 것입니다. –

답변

1

BigDecimal을 사용해야합니다. 그 이유는 부동 소수점 값을 임의의 정밀도로 처리하기 때문입니다. BigDecimal javadoc :

변경할 수없는 임의의 부호가있는 십진수. BigDecimal은 임의의 정밀도 정수 배율되지 않은 값과 32 비트 정수 배율로 구성됩니다. 데이터베이스에 저장된 값의 정밀도를 유지할 수 있기 때문에 데이터베이스 DECIMAL (또는 NUMERIC) 필드로부터 데이터를 검색 할 때

이 유형

가 많이 사용된다. 이것은 금융 애플리케이션/운영에서 특별히 사용됩니다.

그런데 Oracle 데이터베이스에서 사용되는 유형도 FLOAT에서 DECIMAL으로 변경해야합니다. 나는 그것이 당신이/원하는 경우

을 필요로하는 올바른 방법에서 이러한 숫자 값을 처리 할 필요가 무엇을 알고하지 않는

내가 모든 것을 변경 주저 해요, 당신은 모든BigDecimal을 변경해야합니다.

+0

입력 해 주셔서 감사합니다. 불행히도 이것은 대기업의 데이터 저장소이며 10 진수로 변경할 수는 없습니다. 또한 확장하고있는 대규모 오픈 소스 프로그램 (JTrac, 구체적으로)에 의해 도입 된 많은 잘못된 설계 결정을 해결해야합니다. 우리는 그것을 위해 설계된 것 이상으로 그것을 사용하고 있으며, 모든것을 복식으로 저장합니다. 변화는 그것의 작은 모서리 이상에 영향을 미칠 정밀 검사 일 것입니다. 나는 어려워 보이려고 노력하지 않고 피드백에 감사 드리지만 다른 문제가 있습니까? –

+0

@slothario 아니, 당신은 운이 없어. –