Decimal 함수와 연산자

Decimal 함수와 연산자

정확한 십진수 계산을 위한 DECIMAL 타입의 리터럴, 산술 연산자, 비교 연산자에 대해 다뤄요.

출처: 문서

본문

Decimal 리터럴 (Decimal literals)

DECIMAL 'xxxxxxx.yyyyyyy' 문법으로 decimal 리터럴을 정의해요.

리터럴에 대한 decimal 타입의 정밀도(precision)는 리터럴의 자릿수(앞·뒤의 0 포함)와 같아요. 스케일(scale)은 소수부의 자릿수(뒤의 0 포함)와 같아요.

예시 리터럴 데이터 타입
DECIMAL '0' DECIMAL(1)
DECIMAL '12345' DECIMAL(5)
DECIMAL '0000012345.1234500000' DECIMAL(20, 10)

이진 산술 decimal 연산자 (Binary arithmetic decimal operators)

표준 수학 연산자를 지원해요. 아래 표는 결과의 정밀도와 스케일 계산 규칙을 설명해요. xDECIMAL(xp, xs) 타입이고 yDECIMAL(yp, ys) 타입이라고 가정해요.

연산 결과 타입 정밀도 결과 타입 스케일
x + y and x - y min(38, 1 + max(xs, ys) + max(xp - xs, yp - ys)) max(xs, ys)
x * y min(38, xp + yp) xs + ys
x / y min(38, xp + ys-xs + max(0, ys-xs)) max(xs, ys)
x % y min(xp - xs, yp - ys) + max(xs, bs) max(xs, ys)

연산의 수학적 결과가 결과 데이터 타입의 정밀도와 스케일로 정확히 표현할 수 없다면, 예외 조건 Value is out of range가 발생해요.

스케일과 정밀도가 다른 decimal 타입끼리 연산할 때는 값들을 먼저 공통 슈퍼 타입(common super type)으로 강제 변환해요. 표현 가능한 최대 정밀도(38)에 가까운 타입에서는, 한 피연산자가 공통 슈퍼 타입에 맞지 않을 때 Value is out of range 오류가 발생할 수 있어요. 예를 들어 decimal(38, 0)decimal(38, 1)의 공통 슈퍼 타입은 decimal(38, 1)인데, decimal(38, 0)에 들어맞는 특정 값은 decimal(38, 1)로는 표현할 수 없어요.

비교 연산자 (Comparison operators)

모든 표준 비교 함수와 연산자는 decimal 타입에서 동작해요.

단항 decimal 연산자 (Unary decimal operators)

- 연산자는 부정(negation)을 수행해요. 결과 타입은 인자의 타입과 같아요.

더 알아보기 (Learn more)

비교 연산과 관련된 자세한 내용은 비교 함수 문서를 참고해 보세요.