當前位置:首頁 » 數據倉庫 » 資料庫中float類型數據
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫中float類型數據

發布時間: 2022-07-13 17:01:52

sql資料庫中的Float數據類型是占幾位,幾個位元組 ,也就是占幾個0和1

sql資料庫中的Float數據類型是占幾位,幾個位元組 ,也就是占幾個0和1
FLOAT數據類型可精確到第15位小數,其范圍為從-1.79e-308到1.79e+308.每個float類型的數據佔用8個位元組的存儲空間。 float數據類型可寫為float([n])的形式。n指定Float數據的精度。n為1到15之間的整數值。當n取1到7時,實際上是定義了一個real類

㈡ 資料庫裡面創建表是有小數點的是什麼類型

資料庫裡面創建表是有小數點的是float類型。
SQL
Server
數據類型float(n):

-1.79E
+
308

1.79E
+
308
的浮動精度數字數據。
參數
n
指示該欄位保存
4
位元組還是
8
位元組。float(24)
保存
4
位元組,而
float(53)
保存
8
位元組。n
的默認值是
53。
MySQL
數據類型FLOAT(size,d)
帶有浮動小數點的小數字。在括弧中規定最大位數。在
d
參數中規定小數點右側的最大位數。

㈢ mysql里float是什麼東西

今天做實驗,本來以前都已經做得差不多了的,可突然U盤一下子壞掉,計算機無法識別,驅動重裝沒用,別人機器上也不能使用,看來是U盤自身出問題了。而更可怕的是,最近忙著整理材料,所以許多最新版本的材料和學習工作方面的資料都在U盤中,並且其中的許多老版本自己機器上早已刪掉,怪只怪我太信任這塊盤了。沒辦法,實驗得重做,資料可能也得重新寫重新找了......
然後就在做第二個實驗結尾後意外地發現了MySQL數據類型中float的一個問題,現在帖出來請大家指點。網路中許多同仁也遇到了這個問題--傳說中精典的浮點數精度問題。
原文如下:

一、浮點數的概念及誤差問題:
浮點數是用來表示實數的一種方法,它用 M(尾數) * B( 基數)的E(指數)次方來表示實數,相對於定點數來說,在長度一定的情況下,具有表示數據范圍大的特點。但同時也存在誤差問題,這就是著名的浮點數精度問題!
浮點數有多種實現方法,計算機中浮點數的實現大都遵從 IEEE754 標准,IEEE754 規定了單精度浮點數和雙精度浮點數兩種規格,單精度浮點數用4位元組(32bit)表示浮點數,格式是:
1位符號位 8位表示指數 23位表示尾數
雙精度浮點數8位元組(64bit)表示實數,格式是:
1位符號位 11位表示指數 52位表示尾數
同時,IEEE754標准還對尾數的格式做了規范:d.dddddd...,小數點左面只有1位且不能為零,計算機內部是二進制,因此,尾數小數點左面部分總是1。顯然,這個1可以省去,以提高尾數的精度。由上可知,單精度浮點數的尾數是用24bit表示的,雙精度浮點數的尾數是用53bit表示的,轉換成十進制:
2^24 - 1 = 16777215 2^53 - 1 = 9007199254740991
由上可見,IEEE754單精度浮點數的有效數字二進制是24位,按十進制來說,是8位;雙精度浮點數的有效數字二進制是53位,按十進制來說,是16 位。顯然,如果一個實數的有效數字超過8位,用單精度浮點數來表示的話,就會產生誤差!同樣,如果一個實數的有效數字超過16位,用雙精度浮點數來表示,也會產生誤差!對於 1310720000000000000000.66 這個數,有效數字是24位,用單精度或雙精度浮點數表示都會產生誤差,只是程度不同:
單精度浮點數: 1310720040000000000000.00
雙精度浮點數: 1310720000000000000000.00
雙精度差了 0.66 ,單精度差了近4萬億!這個結果為什麼與翟振興例子中的差很多呢?原因是翟振興的測試用表中對欄位進行了限制,實際上顯示的是mysql溢出後的值,而我這里給出的是計算機中實際的值,如果把測試表欄位精度提高到24位或以上,得到的結果就相同了。
以上說明了因長度限制而造成的誤差,但這還不是全部!採用IEEE754標準的計算機浮點數,在內部是用二進製表示的,但在將一個十進制數轉換為二進制浮點數時,也會造成誤差,原因是不是所有的數都能轉換成有限長度的二進制數。對於翟振興測試中用到的 131072.32 這個數,其有效數字是8位,按理應該能用單精度浮點數准確表示,為什麼會出現偏差呢?看一下這個數據二進制尾數就明白了
10000000000000000001010001......
顯然,其尾數超過了24bit,根據舍入規則,尾數只取 100000000000000000010100,結果就造成翟振興測試中遇到的「奇怪」現象!131072.68 用單精度浮點數表示變成 131072.69 ,原因與此類似。實際上有效數字小於8位的數,浮點數也不一定能精確表示,7.22這個數的尾數就無法用24bit二進製表示,當然在資料庫中測試不會有問題(舍入以後還是7.22),但如果參與一些計算,誤差積累後,就可能產生較大的偏差。
二、mysql 和 oracle中的數值類型:
翟振興發現的問題是不是只有 mysql 存在呢?顯然不是,只要是符合IEEE754標準的浮點數實現,都存在相同的問題。
mysql中的數值類型(不包括整型):
IEEE754浮點數: float (單精度) , double 或 real (雙精度)
定點數: decimal 或 numeric
oracle中的數值類型:
oracle 浮點數 : number (注意不指定精度)
IEEE754浮點數: BINARY_FLOAT (單精度) , BINARY_DOUBLE (雙精度)
FLOAT,FLOAT(n) (ansi要求的數據類型)
定點數: number(p,s)
如果在oracle中,用BINARY_FLOAT等來做測試,結果是一樣的。
因此,在資料庫中,對於涉及貨幣或其他精度敏感的數據,應使用定點數來存儲,對mysql來說是 decimal,對oracle來說就是number(p,s)。雙精度浮點數,對於比較大的數據同樣存在問題!
三、編程中也存在浮點數問題:
不光資料庫中存在浮點數問題,編程中也同樣存在,甚至可以說更值得引起注意!
通過上面的介紹,浮點數的誤差問題應該比較清楚了。如果在程序中做復雜的浮點數運算,誤差還會進一步放大。因此,在程序設計中,如果用到浮點數,一定要意識到可能產生的誤差問題。不僅如此,浮點數如果處理不好,還會導致程序BUG!看下面的語句:
if (x != y) { z = 1 / (x -y);}
這個語句看起來沒有問題,但如果是浮點數,就可能存在問題!再看下面的語句會輸出什麼結果:
public class Test {
public static void main(String[] args) throws Exception {
System.out.print("7.22-7.0=" + (7.22f-7.0f));
}
}
我們可能會想當然地認為輸出結果應該是 0.22 ,實際結果卻是 0.21999979 !
因此,在編程中應盡量避免做浮點數的比較,否則可能會導致一些潛在的問題!
除了這些,還應注意浮點數中的一些特殊值,如 NaN、+0、-0、+無窮、-無窮等,IEEE754雖然對此做了一些約定,但各具體實現、不同的硬體結構,也會有一些差異,如果不注意也會造成錯誤!
四、總結:
從上面的分析,我們可以得出以下結論:
1、浮點數存在誤差問題;
2、對貨幣等對精度敏感的數據,應該用定點數表示或存儲;
3、編程中,如果用到浮點數,要特別注意誤差問題,並盡量避免做浮點數比較;
4、要注意浮點數中一些特殊值的處理。
June,浮點數問題,很容易被忽視,可能具有一定的普遍性,也許應該發給其他技術人員,以免再出現這方面的問題。
-----Original Message-----
From: htang [mailto:[email protected]]
Sent: Tuesday, September 26, 2006 6:29 PM
To: 翟振興
Cc: LisaLan; 關寶軍; 韋連友
Subject: RE: RE: mysql中float的問題

這個問題不是一個Bug,而是浮點數本身存在的局限。原因是計算機對浮點數的表示是 M * 2 的 N 次方,其中M是尾數,N是指數,在此轉換過程中存在數據損失,因此浮點數(包括double類型)是不能精確表示所有實數的。出現的問題正是由誤差和四捨五入造成的。
-----Original Message-----
From: 翟振興 [mailto:[email protected]]
Sent: Tuesday, September 26, 2006 12:17 PM
To: htang
Cc: LisaLan; 關寶軍; 韋連友
Subject: Re: RE: mysql中float的問題
Importance: High

老唐,您好!
昨天測試發現,當float數據類型超過131072時候,插入的數據會發現不穩定情況,測試過程如下:
mysql> desc test10;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| floattest | float(12,2) | YES | | NULL | |
| doubletest | double(12,2) | YES | | NULL | |
| dectest | decimal(12,2) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
mysql> insert into test10 values(131071,131071,131071);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
+-----------+------------+-----------+
1 row in set (0.00 sec)
mysql> insert into test10 values(131071.32,131071.32,131071.32);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
+-----------+------------+-----------+
2 rows in set (0.00 sec)
mysql> insert into test10 values(131071.68,131071.68,131071.68);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
+-----------+------------+-----------+
3 rows in set (0.01 sec)
mysql> insert into test10 values(131072,131072,131072);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
+-----------+------------+-----------+
4 rows in set (0.00 sec)
mysql> insert into test10 values(131072.32,131072.32,131072.32);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
+-----------+------------+-----------+
5 rows in set (0.00 sec)
mysql> insert into test10 values(131072.68,131072.68,131072.68);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
| 131072.69 | 131072.68 | 131072.68 |
+-----------+------------+-----------+
6 rows in set (0.00 sec)
mysql> insert into test10 values(131072.66,131072.66,131072.66);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test10;
+-----------+------------+-----------+
| floattest | doubletest | dectest |
+-----------+------------+-----------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
| 131072.69 | 131072.68 | 131072.68 |
| 131072.66 | 131072.66 | 131072.66 |
+-----------+------------+-----------+
mysql> insert into test10 values(1310720000000000000000.66,1310720000000000000000.66,1310720000000000000000.66);
Query OK, 1 row affected, 3 warnings (0.00 sec)
mysql> select * from test10;
+----------------+---------------+---------------+
| floattest | doubletest | dectest |
+----------------+---------------+---------------+
| 131071.00 | 131071.00 | 131071.00 |
| 131071.32 | 131071.32 | 131071.32 |
| 131071.68 | 131071.68 | 131071.68 |
| 131072.00 | 131072.00 | 131072.00 |
| 131072.31 | 131072.32 | 131072.32 |
| 131072.69 | 131072.68 | 131072.68 |
| 131072.66 | 131072.66 | 131072.66 |
| 10000000000.00 | 9999999999.99 | 9999999999.99 |
+----------------+---------------+---------------+

以上測試說明:
當insert的數據范圍在+-131072(65536×2)以內的時候,float數據精度是正確的,但是超出這個范圍的數據就不穩定,沒有發現有相關的參數設置
建議:將float改成double或者decimal,兩者的差別是double是浮點計算,decimal是定點計算,會得到更精確的數據。

㈣ 資料庫中所有的數據類型

SQL 用於各種資料庫的數據類型:

一、MySQL 數據類型:

在 MySQL 中,有三種主要的類型:Text(文本)、Number(數字)和 Date/Time(日期/時間)類型。

1、Text 類型。

㈤ mysql中float用什麼類型

對於浮點列類型,在MySQL中單精度值使用4個位元組,雙精度值使用8個位元組。

FLOAT類型用於表示近似數值數據類型。SQL標准允許在關鍵字FLOAT後面的括弧內選擇用位指定精度(但不能為指數范圍)。MySQL還支持可選的只用於確定存儲大小的精度規定。0到23的精度對應FLOAT列的4位元組單精度。24到53的精度對應DOUBLE列的8位元組雙精度。

MySQL允許使用非標准語法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。這里,「(M,D)」表示該值一共顯示M位整數,其中D位位於小數點後面。例如,定義為FLOAT(7,4)的一個列可以顯示為-999.9999。MySQL保存值時進行四捨五入,因此如果在FLOAT(7,4)列內插入999.00009,近似結果是999.0001。

MySQL將DOUBLE視為DOUBLE PRECISION(非標准擴展)的同義詞。MySQL還將REAL視為DOUBLE PRECISION(非標准擴展)的同義詞,除非SQL伺服器模式包括REAL_AS_FLOAT選項。

為了保證最大可能的可移植性,需要使用近似數值數據值存儲的代碼應使用FLOAT或DOUBLE PRECISION,不規定精度或位數。

DECIMAL和NUMERIC類型在MySQL中視為相同的類型。它們用於保存必須為確切精度的值,例如貨幣數據。當聲明該類型的列時,可以(並且通常要)指定精度和標度;例如:

salary DECIMAL(5,2)
在該例子中,5是精度,2是標度。精度表示保存值的主要位數,標度表示小數點後面可以保存的位數。

在MySQL 5.1中以二進制格式保存DECIMAL和NUMERIC值。

標准SQL要求salary列能夠用5位整數位和兩位小數保存任何值。因此,在這種情況下可以保存在salary列的值的范圍是從-999.99到999.99。

在標准SQL中,語法DECIMAL(M)等價於DECIMAL(M,0)。同樣,語法DECIMAL等價於DECIMAL(M,0),可以通過計算確定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC數據類型的變數形式。M默認值是10。

DECIMAL或NUMERIC的最大位數是65,但具體的DECIMAL或NUMERIC列的實際范圍受具體列的精度或標度約束。如果此類列分配的值小數點後面的位數超過指定的標度允許的范圍,值被轉換為該標度。(具體操作與操作系統有關,但一般結果均被截取到允許的位數)。

㈥ db2資料庫存數據,如何把float型數據存到資料庫中

DB2
中小數對應的是decamil(總長,小數位)類型,你可以先在資料庫建表,然後有三種方式:
1.導出成
xml文件
再導入DB2
2.導出成csv(逗號隔開)格式再導入DB2
3.DB有專門的JDBC包,這個和一般的
資料庫操作
一樣

㈦ SQL中數據類型float與real的區別

一、意思不同

FLOAT浮點型數據類型,FLOAT 數據類型用於存儲單精度浮點數或雙精度浮點數。浮點數使用IEEE(電氣和電子工程師協會)格式。real是不精確的雙精度浮點型,float 和 real 數據類型被稱為近似的數據類型。

二、位元組不同

real型數據的存儲大小為4個位元組,可精確到小數點後第7位數字。這種數據類型的數據存儲范圍為從-3.40E+38~-1.18E-38,0和1.18E-38~3.40E+38。

float型的數據存儲大小為8個位元組,可精確到小數點後第15位數字。這種數據類型的數據存儲范圍為從-1.79E+308~-2.23E-308,0和2.23E+308~1.79E+308。 FLOAT(size,d) 帶有浮動小數點的小數字。在括弧中規定最大位數。在 d 參數中規定小數點右側的最大位數。

二、寫法

float型的數據可寫成float[(n)]的形式。其中n是1~15之間的整數值,指定float型數據的精度。當n為1~7時,實際上用戶定義了一個real型的數據,系統用4個位元組存儲;當n為8~15時,系統認為它是個float型的數據,用8個位元組存儲它。這樣既增強了數據定義的靈活性,又節省了空間。

float 和 real 的使用遵循有關近似數值數據類型的 IEEE 754 規范。

㈧ mysql往資料庫插入float類型的數據 為什麼數字不對

float類型可以存浮點數,但是float有缺點,當不指定小數位數的時候,就會出現小數位數與想要的不一致,導致「報錯」。在創建浮點類型的時候必須指定小數位數,float(m,d),m表示的是最大長度,d表示的顯示的小數位數。

雖然兩個類型的值有相似也有不相似,但定義的是float、插入的值只要不出錯肯定是float類型,10表示該值一共顯示10位整數,其中3位位於小數點後面。

(8)資料庫中float類型數據擴展閱讀:

浮點包可以將二進制浮點數存儲為非標准化數,而不使用剛剛介紹的存儲方法。「非標准化數」是帶有保留指數值的非零浮點數,其中尾數的最高有效位為 0。

通過使用非標准化格式,浮點數的范圍可以擴展,但會失去精度。您無法控制浮點數以標准化形式還是非標准化形式表示;浮點包決定了表示形式。浮點包從不使用非標准化形式,除非指數變為小於可以標准化形式表示的最小值。