ドキュメントには、「精度は1〜38の範囲です。スケールは-84〜127の範囲です」と記載されています。
スケールを精度より大きくするにはどうすればよいですか?スケールは-38から38の範囲にすべきではありませんか?
Oracleのドキュメントによると:
スケールは精度よりも大きくなる可能性があります。最も一般的なのは、表記法が使用されている場合です(小数部が非常に大きくなる可能性があります)。スケールが精度よりも大きい場合、精度は小数点の右側の有効桁数の最大数を指定します。たとえば、として定義された列
NUMBER(4,5)
は、小数点以下の最初の桁にゼロが必要であり、小数点以下5桁を超えるすべての値を丸めます。
これが私がそれを見る方法です:
Precision
がスケール(例)より大きい場合、NUMBER(8,5)
問題ありません。これは簡単です。Precision
つまり、数値は合計8桁で、そのうち5桁は小数部(。→)であるため、整数部(←。)は3桁になります。これは簡単。それが(例)Precision
よりも小さいことがわかる場合、これは3つのことを意味します。Scale
NUMBER(2, 5)
Scale
、小数部の合計桁数を表します。この場合は5。したがって、.12345または.00098にすることができますが、合計で5桁を超えることはできません。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
問題は、なぜそうではないのかということかもしれません。次の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
小さい数を保持できるということは、そのような構造であることがわかります。それほど頻繁には必要ないかもしれませんが、非常に正確であるが非常に小さい数を格納している人がどこかにいると確信しています。
答えてくれたみんなに感謝します。精度は有効桁数のようです。
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
丸めによる2番目のもの。
Oracleのドキュメントによると:
スケールは精度よりも大きくなる可能性があります。最も一般的なのは、表記法が使用されている場合です。スケールが精度よりも大きい場合、精度は小数点の右側の有効桁数の最大数を指定します。たとえば、NUMBER(4,5)として定義された列は、小数点以下の最初の桁にゼロを必要とし、小数点以下5桁を超えるすべての値を丸めます。
入力の整合性チェックを強化するために、固定小数点数列のスケールと精度を指定することをお勧めします。スケールと精度を指定しても、すべての値が固定長になるわけではありません。値が精度を超える場合、Oracleはエラーを返します。値がスケールを超える場合、Oracleはそれを丸めます。
スケールが精度よりも大きい場合は、次のように要約できます。
小数点の右側の桁数=スケール
小数点の右側のゼロの最小数=スケール-精度
--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(precision、scale)があります。ここで、precisionは合計桁数、scaleは小数点以下の桁数です。スケールは省略できますが、ゼロを意味します。精度は指定できません(つまり、NUMBER(*、10)を使用)-これは、必要に応じて合計桁数が必要であることを意味しますが、右に10桁あります
スケールがゼロ未満の場合、値はscale
小数点以下の桁に丸められます。
整数よりも小数点以下の数を予約すると、0.00000000123456のような意味になると思いますが、100%確実ではありません。