source

pl/sql 프로그래머들이 돈 계산으로 흔히 저지르는 실수는 무엇입니까?

bestscript 2023. 8. 8. 23:48

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