2017-06-03 57 views
2

我正在學習MySQL,並且在float的範圍和精度方面有問題。MySQL浮點類型範圍和精度混淆

mannual

對於FLOAT,SQL標準允許的精度的可選規範(但不是指數的範圍)以下括號中的關鍵字FLOAT位數。 MySQL也支持這個可選的精度規格,但精度值僅用於確定存儲大小。從0到23的精度導致一個4字節的單精度FLOAT列。從24到53的精度導致一個8字節的雙精度DOUBLE列。

我創建使用此命令

create table test (f_a float(23)); 

我有4個混亂的表:

  1. 什麼的but not the range of the exponent在mannual意思?
  2. 我可以毫無問題地執行insert into test values (1e38);。即使我輸入38數字,它仍然有效。但39數字或1e39將失敗。那麼這個38的含義是什麼?
  3. 如何檢查f_a的型號轉換?當我執行desc test;時,f_a的類型仍然是float,即使我在該列中插入了38數字編號。
  4. 那麼,範圍精度地球上有什麼區別?
+0

優秀的答案,但也很好的建議是*除非你有這樣做的一個具體的,告知理由不使用這些數據類型* - 這些類型存儲*近似*值,並且偏好範圍超過精度。使用'DECIMAL'通常是你想要的。浮動和雙打肯定是不準確的。如果你計算金錢,'DECIMAL'數據類型是唯一可接受的類型。 –

+1

@ Michael-sqlbot好點!許多tks先生博特:D – spacegoing

回答

3

IEEE浮點表示並不是MySQL唯一的。它遵循各處使用的相同標準。

1)無視長度說明符,這只是噪音。在MySQL,恰好有浮點數據類型:單精度(32位)和雙精度(64位)。

即可選長度說明只是提供了指定DOUBLE的另一種方法。

alter table t add foo FLOAT(4), add bar FLOAT(40) ; 

相當於

alter table t add foo FLOAT , add bar DOUBLE ; 

2)1e38 38是10分的指數功率這相當於

1.0 x 10^38 

沒有潛入所有的細節,浮點號基本上表示爲

sign * mantissa * (radix^exponent) 

例如,在base10,我們可以用這種方式表達了價值123.45

+1 * 0.12345 * (10^3) 

或者,我們可以使用BASE2,並表達值的2倍某些功率(0和1之間)。

3)1e39(1.0 * 10^39)大於可用IEEE單精度FLOAT表示的值的範圍。 (「最大可表示的IEEE 754浮點值爲2 * 2^-23 * 2^27,大約爲3.402x10^38。

DOUBLE精度浮點支持更大範圍的值,最大值爲10^308。

4)範圍是最小值到最大值。對於DOUBLE,範圍是從-1 * 10^30810^308

精度基本上是位數,可以是數對於單精度FLOAT,我們得到一個大約7位精度的十進制數字。對於一個DOUBLE,我們精確度在兩倍左右,15位十進制數字。

-

IEEE浮點並不是MySQL唯一的。幾乎所有的現代處理器都包含浮點算術單元,它們使用浮點數進行操作。

參考文獻:

https://en.wikipedia.org/wiki/Single-precision_floating-point_format

https://en.wikipedia.org/wiki/Double-precision_floating-point_format下面

+0

爲您的努力太多了! – spacegoing