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)); 我有四个困惑: 在手册中,的含义是什么,而不是指数的范围是什么 我可以

我正在学习MySQL,并且在
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