數據庫中慎用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