Decimalリテラルを定義するには、DECIMAL 'xxxxxxx.yyyyyyy'
構文を使用します。
リテラルのDecimal型の精度は、リテラル内の桁数(先頭および末尾のゼロを含む)に等しくなります。スケールは、小数部の桁数(末尾のゼロを含む)に等しくなります。
例文 | データ型 |
---|---|
DECIMAL '0' |
DECIMAL(1) |
DECIMAL '12345' |
DECIMAL(5) |
DECIMAL '0000012345.1234500000' |
DECIMAL(20, 10) |
標準的な数学演算子がサポートされています。以下の表は、結果の精度とスケールの計算ルールを説明しています。ここで、x
はDECIMAL(xp, xs)
型であり、y
はDECIMAL(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 + max(0, ys-xs)) |
max(xs, ys) |
x % y |
min(xp - xs, yp - ys) + max(xs, bs) |
max(xs, ys) |
演算の数学的結果が結果データ型の精度とスケールで正確に表現できない場合、「値が範囲外です」という例外条件が発生します。
異なるスケールと精度を持つDecimal型で演算を行う場合、値はまず共通のスーパータイプに強制的に変換されます。最大表現可能精度(38)に近い型では、1つのオペランドが共通のスーパータイプに収まらない場合に「値が範囲外です」エラーが発生することがあります。例えば、decimal(38, 0) と decimal(38, 1) の共通スーパータイプは decimal(38, 1) ですが、decimal(38, 0) に収まる特定の値は decimal(38, 1) として表現できません。
すべての標準比較がDecimal型に対して機能します。
-
演算子は否定を行います。結果の型は引数の型と同じです。