6

ドキュメントには、「精度は1〜38の範囲です。スケールは-84〜127の範囲です」と記載されています。

スケールを精度より大きくするにはどうすればよいですか?スケールは-38から38の範囲にすべきではありませんか?

4

6 に答える 6

6

Oracleのドキュメントによると:

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

これが私がそれを見る方法です:

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

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

    ここでは、小数部に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
于 2017-08-18T20:25:10.773 に答える
5

問題は、なぜそうではないのかということかもしれません。次の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

小さい数を保持できるということは、そのような構造であることがわかります。それほど頻繁には必要ないかもしれませんが、非常に正確であるが非常に小さい数を格納している人がどこかにいると確信しています。

于 2010-03-18T22:10:30.983 に答える
2

答えてくれたみんなに感謝します。精度は有効桁数のようです。

 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番目のもの。

于 2010-03-20T13:10:17.447 に答える
2

Oracleのドキュメントによると:

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

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

于 2011-06-28T18:31:39.247 に答える
2

スケールが精度よりも大きい場合は、次のように要約できます。

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

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

--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を返す

于 2016-06-06T16:50:47.700 に答える
0

うーん、私が参照を理解しているように、精度は桁数です。
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%確実ではありません。

于 2010-03-18T21:38:00.353 に答える