要求精度高就用decimal
創(chuàng)新互聯(lián)是網(wǎng)站建設專家,致力于互聯(lián)網(wǎng)品牌建設與網(wǎng)絡營銷,專業(yè)領域包括成都網(wǎng)站建設、成都網(wǎng)站設計、電商網(wǎng)站制作開發(fā)、小程序設計、微信營銷、系統(tǒng)平臺開發(fā),與其他網(wǎng)站設計及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結合了恒基網(wǎng)絡品牌建設經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結合,且不斷評估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!
審題錯了...
簡單寫下區(qū)別:
float:浮點型,含字節(jié)數(shù)為4,32bit,數(shù)值范圍為-3.4E38~3.4E38(7個有效位)
double:雙精度實型,含字節(jié)數(shù)為8,64bit數(shù)值范圍-1.7E308~1.7E308(15個有效位)
decimal:數(shù)字型,128bit,不存在精度損失,常用于銀行帳目計算。(28個有效位)
numberic === decimal
float f = 345.98756f;//結果顯示為345.9876,只顯示7個有效位,對最后一位數(shù)四舍五入。
double d=345.975423578631442d;//結果顯示為345.975423578631,只顯示15個有效位,對最后一位四舍五入。
注:float和double的相乘操作,數(shù)字溢出不會報錯,會有精度的損失。
decimal dd=345.545454879.....//可以支持28位,對最后一位四舍五入。
注:當對decimal類型進行操作時,數(shù)值會因溢出而報錯。
可能做程序的人都知道,float類型是可以存浮點數(shù)(即小數(shù)類型),但是float有個壞處,當你給定的數(shù)據(jù)是整數(shù)的時候,那么它就以整數(shù)給你處理。這樣我們在存取貨幣值的時候自然遇到問題,我的default值為:0.00而實際存儲是0,同樣我存取貨幣為12.00,實際存儲是12.幸好mysql提供了兩個數(shù)據(jù)類型:numeric和decimal,這兩種數(shù)據(jù)類型可以輕松解決上面的問題:NUMERIC和DECIMAL類型被MySQL以同樣的類型實現(xiàn),這在SQL92標準中是允許的。他們用于保存對準確精度有重要要求的值,例如與金錢有關的數(shù)據(jù)。當以它們中的之一聲明一個列時,精度和數(shù)值范圍可以(通常是)被指定;例如:salaryDECIMAL(5,2)在這個例子中,5(精度(precision))代表重要的十進制數(shù)字的數(shù)目,2(數(shù)據(jù)范圍(scale))代表在小數(shù)點后的數(shù)字位數(shù)。在這種情況下,因此,salary列可以存儲的值范圍是從-99.99到99.99。(實際上MySQL在這個列中可以存儲的數(shù)值可以一直到999.99,因為它沒有存儲正數(shù)的符號)。譯者注:M與D對DECIMAL(M,D)取值范圍的影響類型說明取值范圍(MySQL=3.23)
實數(shù)是帶有小數(shù)部分的數(shù)字。然而,它們不只是為了存儲小數(shù)部分,也可以使用
DEClMAL 存儲比 BIGINT還大的整數(shù)。 MySQL 既支持精確類型,也支持不精確類型。
FLOAT 和 DOUBLE 類型支持使用標準的渾點運算進行近似計算。如果需要知道浮點運算是
怎么計算的,則需要研究所使用的平臺的浮點數(shù)的具體實現(xiàn)。
DECIMAL 類型用于存儲精確的小數(shù)。在 MySQL 5.0 和更高版本, DECIMAL 類型支持精確 計算。 MySQL 4.1 以及更早版本則使用浮點運算來實現(xiàn) DECIAML 的計算,這樣做會因為 精度損失導致一些奇怪的結果。在這些版本的 MySQL 中,DEClMAL 只是一個"存儲類型"。
因為 CPU 不支持對 DEClMAL 的直接計算,所以在 MySQL 5.0 以及更高版本中, MySQL 服務器自身實現(xiàn)了 DECIMAL 的高精度計算。相對而言, CPU 直接支持原生浮點計算,所 以浮點運算明顯更快。
浮點和 DECIMAL 類型都可以指定精度。對于 DECIMAL 列,可以指定小數(shù)點前后所允許的 最大位數(shù)。這會影響列的空間消耗。 MySQL 5.0 和更高版本將數(shù)字打包保存到一個二進 制字符串中(每 4個字節(jié)存 9個數(shù)字)。例如, DEClMAL(18 ,9)小數(shù)點兩邊將各存儲 9個 數(shù)字,一共使用 9 個字節(jié):小數(shù)點前的數(shù)字用 4 個字節(jié),小數(shù)點后的數(shù)字用 4 個字節(jié), 小數(shù)點本身占 1個字節(jié)。
MySQL 5.0 和更高版本中的 DEClMAL 類型允許最多 65個數(shù)字。而早期的 MySQL 版本中 這個限制是254個數(shù)字,并且保存為未壓縮的字符串(每個數(shù)字一個字節(jié))。然而,這些(早 期)版本實際上并不能在計算中使用這么大的數(shù)字,因為 DECIMAL 只是一種存儲格式: 在計算中 DEClMAL 會轉換為 DOUBLE 類型。
有多種方法可以指定浮點列所需要的精度,這會使得 MySQL 悄悄選擇不同的數(shù)據(jù)類型, 或者在存儲時對值進行取舍。這些精度定義是非標準的,所以我們建議只指定數(shù)據(jù)類型, 不指定精度。
浮點類型在存儲同樣范圍的值時,通常比 DECIMAL 使用更少的空間。 FLOAT 使用 4個字 節(jié)存儲。 DOUBLE 占用8個字節(jié),相比 FLOAT有更高的精度和更大的范圍。和整數(shù)類型一樣, 能選擇的只是存儲類型 IMySQL 使用 DOUBLE 作為內部浮點計算的類型。
因為需要額外的空間和計算開銷,所以應該盡量只在對小數(shù)進行精確計算時才使用
DECIMAL一一例如存儲財務數(shù)據(jù)。但在數(shù)據(jù)量比較大的時候,可以考慮使用 BIGINT 代替
DECIMAL,將需要存儲的貨幣單位根據(jù)小數(shù)的位數(shù)乘以相應的倍數(shù)即可。假設要存儲財
務數(shù)據(jù)精確到萬分之一分,則可以把所有金額乘以一百萬,然后將結果存儲在 BIGI町里,
這樣可以同時避免浮點存儲計算不精確和 DECIMAL 精確計算代價高的問題。