2012-08-23 8 views
0

업데이트 쿼리에 문제가 있습니다. balance1 필드를 6442450941.026600으로 업데이트합니다.Oracle : 업데이트 쿼리 후 정확도가 잘못되었습니다.

update account_subscriber set total_balance1=6442450941.026600 
where SUB_ID='xyz' 

하지만 결과는 (우리가 얻을 선택 stmt를 발사 후) 다음과 같이오고있다

TOTAL_BALANCE1 6442450941.02659988

2 시나리오 : 다음과 같은 값으로 갱신 할 수 있도록합니다

update account_subscriber set total_balance1=6442450941.4567 
where SUB_ID='xyz' 

결과는 6442450941.45670032입니다.

왜 정밀도가 변경되는지 이해할 수 있습니까?

SQL * 플러스 버전은 버전 10.2.0.3.0

감사와 안부, 찬드라 Bhushan 박시

+4

돈 가치를 저장하기 위해 부동 소수점을 사용하지 마십시오! –

+0

NUMBERPS (10,2)와 같은 것이 더 적절할 것입니다. –

+0

은 데이터 유형을 NUMBER (22,8)로 사용했습니다. –

답변

0

당신은 당신이에 의해 필요한 정밀도의 정도에 해결 될 수없는 값을 공급하고 있습니다입니다 수신 열의 데이터 유형. 질문이 암시 하듯 백만 번째의 정밀도가 필요한 경우에는 테이블 필드의 데이터 유형의 정밀도를 검토하고 그에 따라 조정해야합니다.

+0

숫자 (22,8) ... –

+0

으로 데이터 유형을 사용했습니다. 내부 데이터 유형에 대한 오라클의 큰 전문가 인 것처럼 가장하지는 않겠지 만, 숫자 (x, y)가 궁극적으로 기본 100 지수로 표시됩니다. 이는 6442450941.0266과 같은 값이 6.4424509410266 * 100^(지수)와 비슷한 것으로 변환된다는 것을 의미합니다. 즉 "후행 정밀도"가 부정확 한 표현에 대한 위험에 점점 더 직면하고 있음을 의미합니다. –

+0

번호 (22,8)를 실제로 사용하고 있는지 다시 한 번 확인해 주시겠습니까? 해당 데이터 유형과 여기에서 제공 한 값으로 매우 빠른 스크래치 패드 테스트를하고 있는데도 같은 문제가 보이지 않습니다 ...? –

0

부정확 한 데이터 유형을 사용하고 있기 때문입니다.

+0

원하는 결과를 얻으려면이 경우 올바른 데이터 유형이 무엇입니까? –

+0

원하는 정확도에 따라 달라집니다. 어떤 형태의 NUMBER (x, y) – podiluska

+0

데이터 유형은 우리의 경우 숫자 (22,8)입니다. –

0

이것은 단지 pl/sql 개발자 디스플레이 문제 일뿐입니다. PL/SQL 개발자의 도구 메뉴 및 환경 설정 옵션을 선택하고 SQL 윈도우 유형 및 번호 레이아웃에서 형식이 지정된 옵션의 선택을 취소하고 다른 옵션을 선택하고 올바른 결과를보십시오. :)

3

내가 말할 수있는 유일한 설명은 데이터베이스 사이의 경로 어딘가에 표시되는 위치이며 부동 소수점 값으로 변환됩니다. 필자는 오라클 개발 툴에 PL/SQL Developer를 사용하여 매우 신뢰할 만하다고 생각합니다.

create TABLE rpj_test (val number(22, 8)); 

INSERT INTO rpj_test(val) VALUES (6442450941.026600); 

SELECT * FROM rpj_test; 

을하고 난 당신이보고 정확한 결과 (6442450941.02659968)을 얻었다 : 그래서 다음 실행했을 때 놀랍게도 상상. WTF?!?!?

그러나 그때 나는 중요한 질문을 던졌습니다. 올바른 데이터가 실제로 데이터베이스에 있음을 나에게 확신시키기 위해 어떻게 테스트 할 수 있습니까? 그래서 다음 쿼리를 실행했습니다 :

SELECT val * 10000 FROM rpj_test; 

그리고 예상 답변 (64424509410266)을 받았습니다.

그래서 데이터베이스의 데이터가 올바른 것처럼 보입니다. 놀랍지는 않습니다. 오라클의 NUMBER 유형이 제품의 가장 잘 알려지지 않은 기능 중 하나라고 생각합니다. 영원히 계속되었으며, ROCK SOLID입니다. 시스템이 올바르게 작동 할 수있는 기회를 원한다면 더 좋을 것입니다.). 좋아, 내 눈에는 이것이 부동 소수점 변환 오류처럼 보입니다. 어떻게해야합니까? 그래서 내가 PL/SQL Developer의 환경 설정 대화 상자에서 훑어 보았습니다.이 대화 상자에서 SQL Window 탭의 "Number fields to_char"이라는 제목의 깔끔한 작은 설정을 확인했습니다. 이걸 확인하고 첫 번째 SELECT 쿼리를 다시 실행 한 다음 예상대로 데이터가 표시되는지 확인합니다.

이야기의 도덕 :

  1. 번호를 계산하고 저장 올바르게. 버그가 발견되었다고 생각하면 은 정말이고 실제로는이 반복적으로 힘들다고 생각합니다. 그것을 16 가지의 다른 방법으로 시험하십시오. 이것이 사실은 버그가 아니라는 것을 증명할 수있는 방법을 찾아냅니다.
  2. 사용하는 도구가 얻는 결과에 영향을줍니다.

공유하고 즐기십시오.