Double類型只用8字節存儲但範圍爲什麼那麼大
ODPS的Double描述:
類型 描述 取值範圍
Double 8字節雙精度浮點數。 -1.0E308 ~ 1.0E308
Double用8字節雙精度浮點數
1.0E+38
1.0乘以10的308次方,爲什麼會這麼大?64位能表示的最大不應該是2^64嗎?
1,因爲double類型是浮點數,這種類型可以用科學記數法表示,所以表示範圍非常大。
但是,使用可浮點數的代價就是損失了精度。它把這部分精度用於指數的表示。
所以double類型的優點就是數據範圍大,缺點是精度不足,大概只有15~16位有效位數。
2,它表示大數的代價就是損失了精度。舉個例子:假設我有0-9這10個數,我定義數n表示5n,那麼這10個數最大能表示5*9=45。
能表示的範圍是:0、5、10、15、20、25、30、35、40、45。最小值爲0,最大值爲45。所以表示的範圍是:0~45。
但1、2、3、4,......,41,42,43,44這些不是5的倍數的數就沒法精確表示了,只能在定義中把它們靠向0、5、......、40或者45。
這就是爲了擴大表示範圍而損失了表示精度。
Oracle NUMBER類型的最大字符個數是38
所以,Oracle NUMBER能表示的最大整數爲:a = 99999999999999999999999999999999999999(38個9)
如果轉換成DOUBLE,會丟失精度,用DOUBLE存儲以後,實際的結果爲:b = 1E38 即 10^38 = 100000000000000000000000000000000000000
顯然:a ≈ b
但b不是我們期待的值,除非實際應用場景能夠認可。
所有Oracle NUMBER不能簡單的轉爲DOUBLE存儲,會丟失精度。