国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql下float類型一些誤差詳解

2024-07-24 12:38:35
字體:
供稿:網(wǎng)友

我想很多朋友都不怎么會在mysql中使用float類型,特別是用到金錢時我們可能會用雙精度來做,我們知道m(xù)ysql的float類型是單精度浮點類型不小心就會導致數(shù)據(jù)誤差

單精度浮點數(shù)用4字節(jié)(32bit)表示浮點數(shù),采用IEEE754標準的計算機浮點數(shù),在內(nèi)部是用二進制表示的,如:7.22用32位二進制是表示不下的,所以就不精確了。

mysql中float數(shù)據(jù)類型的問題總結(jié)  

對于單精度浮點數(shù)Float:當數(shù)據(jù)范圍在±131072(65536×2)以內(nèi)的時候,float數(shù)據(jù)精度是正確的,但是超出這個范圍的數(shù)據(jù)就不穩(wěn)定,沒有發(fā)現(xiàn)有相關的參數(shù)設置建議:將float改成double或者decimal,兩者的差別是double是浮點計算,decimal是定點計算,會得到更精確的數(shù)據(jù)。

1.float類型

float列類型默認長度查不到結(jié)果,必須指定精度,比如 num  float,  insert into  table (num) values (0.12); select  * from table where num=0.12的話,empty set,代碼如下:

  1. num float(9,7),  insert into  table (num) values (0.12); select  * from table where num=0.12的話會查到這條記錄。 
  2.  
  3. mysql> create table tt 
  4.     -> (    
  5.     -> num  float(9,3) 
  6.     -> ); 
  7. Query OK, 0 rows affected (0.03 sec) 
  8.  
  9. mysql> insert into tt(num)values(1234567.8); 
  10. ERROR 1264 (22003): Out of range value for column 'num' at row 1 

注:超出字段范圍,無法插入,代碼如下:

  1. mysql> insert into tt(num)values(123456.8); 
  2. Query OK, 1 row affected (0.00 sec) 
  3.  
  4. mysql> select  * from  tt; 
  5. +------------+ 
  6. | num        | 
  7. +------------+ 
  8. | 123456.797 | 
  9. +------------+ 
  10. 1 row in set (0.00 sec) 

注:小數(shù)位數(shù)不夠,自動補齊,但是存在一個問題就是如上的近似值,代碼如下:

  1. mysql> insert into tt(num)values(123456.867); 
  2. Query OK, 1 row affected (0.04 sec) 
  3.  
  4. mysql> select * from   tt; 
  5. +------------+   
  6. | num        | 
  7. +------------+ 
  8. | 123456.797 | 
  9. | 123456.797 | 
  10. | 123456.867 | 
  11. +------------+ 
  12. rows in set (0.00 sec) 
  13.  
  14. mysql> select  * from tt where  num=123456.867; 
  15. +------------+ 
  16. | num        | 
  17. +------------+ 
  18. | 123456.867 | 
  19. +------------+ 
  20. 1 row in set (0.00 sec) 
  21.  
  22. mysql> insert into tt(num)values(2.8); 
  23. Query OK, 1 row affected (0.04 sec) 
  24.  
  25. mysql> select * from   tt; 
  26. +------------+ 
  27. | num        | 
  28. +------------+ 
  29. | 123456.797 | 
  30. | 123456.797 | 
  31. | 123456.867 | 
  32. |      2.800 | 
  33. +------------+ 
  34. rows in set (0.00 sec) 
  35.  
  36. mysql> select  * from tt where  num=2.8; 
  37. +-------+   
  38. | num   | 
  39. +-------+ 
  40. | 2.800 | 
  41. +-------+ 
  42. 1 row in set (0.00 sec) 
  43.  
  44. mysql> insert into tt(num)values(2.888888); 
  45. Query OK, 1 row affected (0.00 sec) 
  46. --Vevb.com 
  47. mysql> select  * from  tt; 
  48. +------------+ 
  49. | num        | 
  50. +------------+ 
  51. | 123456.797 | 
  52. | 123456.797 | 
  53. | 123456.867 | 
  54. |      2.800 | 
  55. |      2.889 | 
  56. +------------+ 
  57. rows in set (0.00 sec) 

注:小數(shù)位數(shù)超了,自動取近似值.

一、浮點數(shù)的概念及誤差問題

浮點數(shù)是用來表示實數(shù)的一種方法,它用 M(尾數(shù)) * B( 基數(shù))的E(指數(shù))次方來表示實數(shù),相對于定點數(shù)來說,在長度一定的情況下,具有表示數(shù)據(jù)范圍大的特點,但同時也存在誤差問題,這就是著名的浮點數(shù)精度問題,浮點數(shù)有多種實現(xiàn)方法,計算機中浮點數(shù)的實現(xiàn)大都遵從 IEEE754 標準,IEEE754 規(guī)定了單精度浮點數(shù)和雙精度浮點數(shù)兩種規(guī)格,單精度浮點數(shù)用4字節(jié)(32bit)表示浮點數(shù),格式是:1位符號位 8位表示指數(shù) 23位表示尾數(shù),雙精度浮點數(shù)8字節(jié)(64bit)表示實數(shù),格式是:1位符號位 11位表示指數(shù) 52位表示尾數(shù).

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泗水县| 靖江市| 夏津县| 英德市| 永春县| 泰宁县| 邓州市| 阿坝| 定安县| 噶尔县| 靖宇县| 福建省| 星子县| 曲沃县| 额尔古纳市| 轮台县| 广汉市| 罗山县| 内丘县| 临沧市| 安仁县| 镇江市| 凤山县| 二连浩特市| 喀喇| 贵溪市| 桑日县| 吴忠市| 大荔县| 綦江县| 永平县| 彝良县| 青岛市| 将乐县| 岳普湖县| 惠安县| 涡阳县| 攀枝花市| 山阴县| 成武县| 洱源县|