2010-03-18 157 views

回答

4

這個問題可能是爲什麼不是? 請嘗試以下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 

你看到的是,你可以舉辦小型的數字是那種結構的 它可能不是很經常需要,但我敢肯定的地方是誰的人是存儲非常精確,但非常小的數字。

+0

@加里,謝謝你的例子。文檔中說精度是總位數,標度是小數點後的數字。那麼NUMBER(2,5)如何將「總位數」設爲2,並在小數點後面存儲5位數? – aiGuru 2010-03-18 22:22:15

+2

我認爲是這樣的: NUMBER(2,5)例如0.00012 = 1.2E-4 或類似的東西 – Tobias 2010-03-19 07:19:12

0

嗯,據我所知,參考精度是數字的計數。
maximum precision of 126 binary digits, which is roughly equivalent to 38 decimal digits

在oracle中你有類型NUMBER(精度,小數)其中精度的數字和刻度總數的小數點數字的正確數量。比例可以省略,但它意味着零。精度可以不指定(使用即NUMBER(*,10)) - 這意味着總數位數是按需要的,但有10位數字正確

如果比例小於零,則數值將四捨五入爲scale數字離開小數點。
我認爲,如果你保留更多的小數點右邊的數字比整個數字中可以有更多的數字,這意味着類似於0.0000000,但我不是100%確定。

+0

託拜厄斯:如果規模比精度較大(例如'NUMBER(1,2)'),那麼我們得到'ORA-06502:PL/SQL:數字或值錯誤字符串'當試圖**分配**一個值給它 - 而不是當**定義**它... – 2010-03-18 21:59:55

2

感謝大家的答案。它看起來像精度是有效數字的數量。

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

結果:

.00012 

select cast(0.0as 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文檔:

量表可以大於精度,最常用當E表示法。當比例大於精度時,精度將指定小數點右側的最大有效位數。例如,定義爲NUMBER(4,5)的列對小數點後的第一個數字要求爲零,並將小數點後的第五個數字後的所有值四捨五入。

指定定點編號列的比例和精度以便對輸入進行額外的完整性檢查是一種很好的做法。指定比例和精度不會將所有值強制爲固定長度。如果一個值超過精度,則Oracle返回一個錯誤。如果一個值超過了規模,那麼Oracle會對其進行調整。

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.00as number(2,5)) from dual; 

返回0.00012

-- and of course this will work too 
select cast(0.000as number(2,5)) from dual; 

返回0.00001

1

根據Oracle文檔:

規模可以大於精度,最常用當使用前符號(其中小數部分可以是如此之大) 。當比例大於精度時,精度將指定小數點右側的最大有效位數。例如,定義爲NUMBER(4,5)的列要求小數點後第一位的值爲零,並將小數點後第五位後的所有值四捨五入。

我是這樣看的:

  • Precision比規模更大(如),沒問題,這很簡單。 Precision表示該數字共有8位數字,其中5個位於小數部分(。→),因此整數部分(←。)將有3位數字。這很容易。
  • 當你看到Precision小於Scale(例如NUMBER(2, 5)),這意味着3兩件事:

    • 的數量不會有任何的整數部分,只有小數部分。所以整數部分的0不計算在計算中,你說.12345不是0.12345。事實上,如果你在整數部分只指定了1位數,它總會返回一個錯誤。
    • Scale表示數字小數部分的總位數。 5在這種情況下。因此它可以是.12345或.00098,但總共不超過5位數。
    • 小數部分分爲2部分,有效數字和零。重要數字由Precision指定,最小零數等於(Scale - Precision)。例如:

    這裏的數量將必須在小數部分的最小的3個零。其次是2個有效數字(也可以爲零)。所以3個零點+2個有效數字= 5這就是Scale號碼。

總之,當你看到例如NUMBER(6,9),這告訴我們,小數部分將有共9個數字,通過強制性的3個零開始,其次是6位數字。

下面是一些例子:

SELECT CAST(.000AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|
SELECT CAST(.000AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|
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 
相關問題