MySQL浮点类型范围和精度混淆
我正在学习MySQL,并且在MySQL浮点类型范围和精度混淆,mysql,floating-point,Mysql,Floating Point,我正在学习MySQL,并且在float的范围和精度方面存在问题 从: 对于FLOAT,SQL标准允许在括号中的关键字FLOAT后面的位中指定可选的精度(但不是指数的范围)。MySQL还支持此可选精度规范,但精度值仅用于确定存储大小。0到23之间的精度将产生一个4字节的单精度浮点列。从24到53的精度将产生一个8字节的双精度双列 我使用这个命令创建了一个表 create table test (f_a float(23)); 我有四个困惑: 在手册中,的含义是什么,而不是指数的范围是什么 我可以
float
的范围和精度方面存在问题
从:
对于FLOAT,SQL标准允许在括号中的关键字FLOAT后面的位中指定可选的精度(但不是指数的范围)。MySQL还支持此可选精度规范,但精度值仅用于确定存储大小。0到23之间的精度将产生一个4字节的单精度浮点列。从24到53的精度将产生一个8字节的双精度双列
我使用这个命令创建了一个表
create table test (f_a float(23));
我有四个困惑:
的含义是什么,而不是指数的范围是什么
插入测试值(1e38)代码>没有问题。即使我输入了38个数字,它仍然有效。但是39
数字或1e39
将失败。那么这个38
是什么意思呢
f_a
的类型转换?当我执行desc测试时
即使在我将38
数字插入该列后,f_a
的类型仍然是float
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,并表示一个值(0到1之间)乘以2的某个幂
3) 1e39
(1.0*10^39)大于可用IEEE单精度浮点表示的值范围。(“可表示的IEEE 754浮点值的最大值为2*2^−23*2^27,约为3.402x10^38
双精度浮点支持更大范围的值,最多可达10^308
4) 范围是从最小值到最大值的范围。对于DOUBLE,范围是从-1*10^308
到10^308
精度基本上是可以表示的位数。对于单精度浮点,我们得到大约7位小数精度。对于双精度浮点,我们得到的精度是该精度的两倍,即15位小数
--
IEEE浮点不是MySQL独有的。几乎所有的现代处理器都包含浮点运算单元,它们对浮点数进行运算
参考资料:
tks非常感谢您的努力!下面是一个很好的答案,但也是一个很好的建议:除非您有明确的理由,否则不要使用这些数据类型——这些类型存储近似值,并且更喜欢范围而不是精度。使用
十进制通常是您想要的。浮点和双精度必然不精确。如果您在计算货币时,DECIMAL
数据类型是唯一可接受的类型。@Michael sqlbot观点不错!许多tk Bot先生:D