Oracle NUMBER のスケールを精度より大きくするにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/2473466

  •  20-09-2019
  •  | 
  •  

質問

ドキュメントには次のように記載されています。「精度の範囲は 1 ~ 38 です。スケールの範囲は -84 ~ 127 インチです。

スケールが精度よりも大きくなるのはなぜでしょうか?Scale の範囲は -38 から 38 でなければなりませんか?

役に立ちましたか?

解決

質問はなぜだろうか? 次のSQLを試してみてください。

select cast(0.0001 as number(2,5)) num, 
       to_char(cast(0.0001 as number(2,5))) cnum,
       dump(cast(0.0001 as number(2,5))) dmp
  from dual

あなたは何を参照してくださいあなたは小さな数字を保持できるということである構造の一種であります これは非常に頻繁に必要とされないことがありますが、私はどこかに非常に正確なが、非常に小さな数字を記憶している誰かがあると確信しています。

他のヒント

Oracle のドキュメントによると、次のようになります。

スケールが精度よりも大きくなる可能性があります。これは、ex 表記が使用される場合に最も一般的です (小数部分が非常に大きくなる可能性があります)。スケールが精度より大きい場合、精度は小数点の右側の最大有効桁数を指定します。たとえば、次のように定義された列 NUMBER(4,5) 小数点以下の最初の桁にはゼロが必要で、小数点以下の 5 桁以降の値はすべて四捨五入されます。

私がそれをどう見るかは次のとおりです。

  • いつ Precision スケールより大きい (例: NUMBER(8,5))、問題ありません。これは簡単です。 Precision は、数値が合計 8 桁になることを意味し、そのうち 5 桁は小数部 (.→) に含まれるため、整数部 (←.) は 3 桁になります。かんたんだよ。
  • それを見ると Precision よりも小さいです Scale (例えば NUMBER(2, 5))、これは 3 つのことを意味します。

    • 数値には整数部分はなく、小数部分のみが含まれます。つまり、整数部分の 0 は計算にカウントされず、0.12345 ではなく .12345 と言います。実際、整数部分に 1 桁だけを指定すると、必ずエラーが返されます。
    • Scale は、数値の小数部の合計桁数を表します。この場合は5です。したがって、.12345 または .00098 にすることができますが、合計は 5 桁以内です。
    • 小数部は有効数字とゼロの 2 つの部分に分割されます。有効数字は次のように指定されます。 Precision, 、ゼロの最小数は (Scale - Precision)。例 :

    ここで、数値の小数部には少なくとも 3 つのゼロが必要です。その後に 2 つの有効な数字が続きます (ゼロの場合もあります)。したがって、3 つのゼロ + 2 つの有効数字 = 5 になります。 Scale 番号。

簡単に言うと、たとえばこれを見ると、 NUMBER(6,9), これは、小数部分が、必須の 3 つのゼロで始まり、その後に 6 桁が続く合計 9 桁であることがわかります。

ここではいくつかの例を示します :

SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual;   -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual;    -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual;    -- prints: 0.0136; max 4 digits, .013579 rounded to .0136

答えをみんなに感謝します。精度は有効桁数であるように見えます。

 select cast(0.000123 as number(2,5)) from dual

での結果ます:

.00012

ここで、

 select cast(0.00123 as number(2,5)) from dual

 select cast(0.000999 as number(2,5)) from dual

の両方の結果ます:

ORA-01438: value larger than specified precision allowed for this column

第二1四捨五入する。

は、Oracleのマニュアルによると:

スケールは、最も一般的には、E表記を使用した場合、精度よりも大きくすることができます。スケールが精度よりも大きい場合、精度は、小数点の右側の最大有効桁数を指定します。たとえば、NUMBER(4,5)として定義された列は、小数点の後の最初の桁のゼロを必要とし、小数点以下5桁目を越えてすべての値を丸めます。

入力時にチェックし、余分な整合性のための固定小数点数の列のスケールと精度を指定することをお勧めします。スケールと精度を指定すると、固定長にすべての値を強制しません。値は精度を超えた場合、Oracleはエラーを返します。値がスケールを超えた場合、Oracleはそれを丸めます。

Scaleは精度がこのように要約することができるよりも大きい場合:

小数点の右側の桁数=スケール

右小数点のゼロの最小数=スケール - 精密

--this will work 
select cast(0.123456 as number(5,5)) from dual;

0.12346

を返します。
-- but this
select cast(0.123456 as number(2,5)) from dual;
--will return "ORA-1438 value too large".  
--It will not return err with at least 5-2 = 3 zeroes:
select cast(0.000123456 as number(2,5)) from dual;

0.00012

を返します。
-- and of course this will work too
select cast(0.0000123456 as number(2,5)) from dual;

帰国0.00001

私は、参照を理解し、

うーん精度は数字のカウントです。
maximum precision of 126 binary digits, which is roughly equivalent to 38 decimal digits

オラクルでは、精度は、数字とスケールの総数は小数点の桁右の数であるタイプNUMBER(精度、スケール)を有します。スケールは省略することができますが、それはゼロを意味します。精度(すなわちNUMBER(*、10)を使用)不特定することができる - これは、必要に応じて桁数の合計であることを意味するが、10桁は右

あります スケールがゼロ未満である場合、値はscale桁に丸められます。

は、小数点を左。
私はあなたが右の整数であっする以上の小数点以下のより多くの番号を予約すれば、これは0.00000000123456のようなものを意味しますが、私は100%を確認していないと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top