pl/sql 프로그래머들이 돈 계산으로 흔히 저지르는 실수는 무엇입니까?
안녕하세요. 저는 pl/sql 프로그래머들이 많은 금전적 계산을 다루는 애플리케이션을 프로그래밍할 때 흔히 저지르는 실수를 찾고 있습니다. (할인, 세금, 요금 등)저는 화폐 계산을 위해 자바와 휴면기를 사용해 왔습니다. 제가 기억하는 한 자바에는 BigDecimal과 같은 일련의 규칙과 모범 사례가 있습니다. 정밀도를 유지하는 등.현재 저는 금융 모듈을 다루는 데 있어 저의 pl/sql 기술을 향상시키려고 노력하고 있습니다. 그래서 저는 이것을 알고 싶고 그것들을 피하고 싶습니다.또한 이를 위한 기존 mantra 또는 pl/sql 모범 사례가 있습니까?여러분, 잘 부탁드립니다.
다음 예제 사용:
create table t_val
(id number(10,0),
value number(5,2));
declare
v_dummy number;
begin
delete from t_val;
for i in 9 .. 20 loop
insert into t_val values (i, 1/i);
select count(*)
into v_dummy
from t_val
where value = 1/i;
dbms_output.put_line(to_char(i,'00')||':'||v_dummy||':'||
to_char(1/i,'000.999999'));
end loop;
--
end;
/
select id, value from t_val order by 1;
코드가 0.11111로 반올림된 0.11111을 삽입하는 것을 볼 수 있습니다. 코드가 즉시 0.11111에 대한 값을 계산하려고 하면 일치하는 항목을 찾지 못합니다.
마찬가지로 (1/14) 및 (1/15)의 값은 모두 0.07로 반올림됩니다.
이것은 PL/SQL에만 국한된 문제가 아니며, '클라이언트'의 값이 데이터베이스에 들어갈 때 반올림될 때 자바와 PHP 코드에서 비슷한 문제를 본 적이 있습니다.그러나 PL/SQL은 특정 테이블/열 유형의 변수를 선언할 수 있으므로 더 나은 솔루션을 제공하며, 열이 변경되더라도 이 바인딩은 유지됩니다.
declare
v_value t_val.value%type;
v_dummy number;
begin
delete from t_val;
for i in 9 .. 20 loop
v_value := 1/i;
insert into t_val values (i, v_value);
select count(*)
into v_dummy
from t_val
where value = v_value;
dbms_output.put_line(to_char(i,'00')||':'||v_dummy||':'||
to_char(1/i,'000.999999')||':'||to_char(v_value,'000.999999'));
end loop;
--
end;
/
따라서 SQL 문을 다룰 때는 기본 테이블의 유형(길이/척도/정밀도 포함)에 고정된 바인딩 변수를 사용하는 것이 좋습니다.
다음은 두 가지 간단한 힌트입니다.
실용적인 Oracle 팁: NUMBER(스케일/프리크 없음)를 테이블 열 유형으로 사용하거나 PL/SQL에서 사용하면 많은 두통을 줄일 수 있습니다.NUMBER(x,y)는 스토리지 또는 CPU 사이클을 저장하지 않습니다.
일반적인 힌트(먼저 전체 그림을 보고자 함):
첫째, 소수점 연산과 관련된 특정 앱 요구 사항이 실제로 무엇인지 조사하십시오. 세금을 부과합니까? 만약 있다면, 미국 또는 유럽연합입니까? 반올림 규칙은 관할 구역 및/또는 적용에 따라 다릅니다.Oracle SQL은 원하는 항목을 지원합니까?PL/SQL을 사용합니까? 그렇지 않다면, PL/SQL을 사용하여 그런 작업을 수행하는 것이 실수입니다.
다가오는 십진법의 금본위제는 IEEE 십진법 128입니다.예를 들어 위키백과와 http://www.carus-hannover.de/doc/DFP_PW6_in_SAP_NetWeaver_0907.pdf 에서 읽고 싶을 것입니다.라운딩 등 모든 맛을 지원합니다.Oracle QL/PL/SQL에 대해 잘 모르겠습니다.
모든 언어로 MONEY 유형을 다루는 문제는 다음과 같습니다.
- 잘라내기 - 반올림해야 하지만 결과가 잘라지는 경우.
- 반올림 - 잘렸어야 하는데 반올림된 경우.
만약 당신이 모든 단계에서 이것들을 조심한다면, 돈을 다루는 것은 그렇게 어려운 일이 아닙니다.
언급URL : https://stackoverflow.com/questions/7199344/what-are-the-common-mistakes-pl-sql-programmers-make-with-money-computation
'source' 카테고리의 다른 글
| Get-Aduser - 필터가 변수를 허용하지 않습니다. (0) | 2023.08.28 |
|---|---|
| 라라벨 웅변가 연산자 간의 사용 방법 (0) | 2023.08.08 |
| 모든 파일에 대해 --ours/--theirs를 사용하여 충돌 해결 (0) | 2023.08.08 |
| pathVariable이 있는 URL에만 Spring Security AntMatchers 패턴을 적용하는 방법 (0) | 2023.08.08 |
| 이벤트 핸들러가 jQuery의 요소에 바인딩되어 있는지 테스트 (0) | 2023.08.08 |