-
1 # 湯圓電影Vlog
-
2 # pietr49411
實數是帶有小數部分的數字。然而,它們不只是為了儲存小數部分,也可以使用DEClMAL 儲存比 BIGINT還大的整數。 MySQL 既支援精確型別,也支援不精確型別。FLOAT 和 DOUBLE 型別支援使用標準的渾點運算進行近似計算。如果需要知道浮點運算是怎麼計算的,則需要研究所使用的平臺的浮點數的具體實現。DECIMAL 型別用於儲存精確的小數。在 MySQL 5.0 和更高版本, DECIMAL 型別支援精確 計算。 MySQL 4.1 以及更早版本則使用浮點運算來實現 DECIAML 的計算,這樣做會因為 精度損失導致一些奇怪的結果。在這些版本的 MySQL 中,DEClMAL 只是一個"儲存型別"。因為 CPU 不支援對 DEClMAL 的直接計算,所以在 MySQL 5.0 以及更高版本中, MySQL 伺服器自身實現了 DECIMAL 的高精度計算。相對而言, CPU 直接支援原生浮點計算,所 以浮點運算明顯更快。浮點和 DECIMAL 型別都可以指定精度。對於 DECIMAL 列,可以指定小數點前後所允許的 最大位數。這會影響列的空間消耗。 MySQL 5.0 和更高版本將數字打包儲存到一個二進 制字串中(每 4個位元組存 9個數字)。例如, DEClMAL(18 ,9)小數點兩邊將各儲存 9個 數字,一共使用 9 個位元組:小數點前的數字用 4 個位元組,小數點後的數字用 4 個位元組, 小數點本身佔 1個位元組。MySQL 5.0 和更高版本中的 DEClMAL 型別允許最多 65個數字。而早期的 MySQL 版本中 這個限制是254個數字,並且儲存為未壓縮的字串(每個數字一個位元組)。然而,這些(早 期)版本實際上並不能在計算中使用這麼大的數字,因為 DECIMAL 只是一種儲存格式: 在計算中 DEClMAL 會轉換為 DOUBLE 型別。有多種方法可以指定浮點列所需要的精度,這會使得 MySQL 悄悄選擇不同的資料型別, 或者在儲存時對值進行取捨。這些精度定義是非標準的,所以我們建議只指定資料型別, 不指定精度。浮點型別在儲存同樣範圍的值時,通常比 DECIMAL 使用更少的空間。 FLOAT 使用 4個字 節儲存。 DOUBLE 佔用8個位元組,相比 FLOAT有更高的精度和更大的範圍。和整數型別一樣, 能選擇的只是儲存型別 IMySQL 使用 DOUBLE 作為內部浮點計算的型別。因為需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用DECIMAL一一例如儲存財務資料。但在資料量比較大的時候,可以考慮使用 BIGINT 代替DECIMAL,將需要儲存的貨幣單位根據小數的位數乘以相應的倍數即可。假設要儲存財務資料精確到萬分之一分,則可以把所有金額乘以一百萬,然後將結果儲存在 BIGI町裡,這樣可以同時避免浮點儲存計算不精確和 DECIMAL 精確計算代價高的問題。
回覆列表
float 單精度浮點 32bit,double 雙精度浮點64bit,decimal是高精度 128bit,浮點型。float double 是 基本型別(primitive type),decimal不是。float 有效數字7位,範圍 ±1.5 × 10E−45 to ±3.4 × 10E38double 有效數字15/16 位,範圍 ±5.0 × 10 E−324 to ±1.7 × 10E308decimal 有效數字 28/29 位,範圍 ±1.0 × 10E−28 to ±7.9 × 10E28( E -- 下接幾次方) decimal的有效位數很大,達到了28位,但是表示的資料範圍卻比float和double型別小。使用的時候會對計算時的效能有影響。常數寫法:float f = 12.3F; (帶F)double x=12.3; (不帶就是double)decimal d = 12.30M; (帶M) 浮點數運算會有精度損失問題,有精度損失時程式不會報告,要程式設計師自己注意。