程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 數據庫中慎用float數據類型

數據庫中慎用float數據類型

編輯:MySQL綜合教程

數據庫中慎用float數據類型   大多數編程語言都支持float或者double的數據類型。而數據庫中也有相同關鍵字的數據類型,因此很多開發人員也自然而然地在需要浮點數的地方使用float作為字段類型。  www.2cto.com     但事實上是否float可以適用於所有的業務場景呢?   float類型是根據IEEE 754標准使用二進制格式編碼實數數據,對於一些小數,比如59.95,float類型會存儲了二進制中最接近59.95的值,用十進制表示等於59.950000762939。 當然,有些數據庫能夠通過某種方式彌補這種數據的不精確性,查詢結果在時候可以輸出我們所期望的值。 如下面所示:   Sql代碼   select  rate from t_refresh where  id  =1;      Returns:59.95    但是,如果將這個值擴大十億倍:  www.2cto.com     Sql代碼   select  rate * 1000000000 from t_refresh where  id  =1;      Return:59950000762.939     這可能和你期望的結果59950000000.000不太一樣了。 在上面在例子中,誤差在千萬分之一內,對於部分的運算來說已經足夠了。 然而,在某些運算中,這樣的誤差是不能容忍的,如比較的操作: Sql代碼   select  *  from t_refresh where rate  = 59.95      Result:empty set;no rows match,     因為rate的實際存儲值是比59.95大一點點。 又如在金融項目中計算復利,需要進行多次浮點數乘法運算,使用float類型會導致誤差不斷累積。    www.2cto.com   因此,在某些業務場景中,我們需要用numeric或者decimal來代替float數據類型。   和float類型相比,numeric和decimal存儲的是精確值,如果你insert進去的是一個59.95,實際存的也是59.95。 所以在上面在例子中,如果用numeric或者decimal Sql代碼   select  rate * 1000000000 from t_refresh where  id  =1;      Return:59950000000     Sql代碼   select  id  from t_refresh where rate  = 59.95      Return:1     結論:   float適用於精度要求低,   數值范圍大的科學運算場景 金融、統計等精度要求高的場景,則需要用numeric或者decimal
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved