2017-06-03 56 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