MySQL浮点数和定点数

  1. 浮点型:

    类型 字节数 signed范围 unsigned范围 描述
    float 4 (-3.4E+38, 3.4E+38) 0 和 (1.1E-38, 3.4E+38) 单精度浮点数
    double 8 (-1.7E+308, 1.7E+38) 0 和 (2.2E-308, 1.7E+308) 双精度浮点数

    补充:根据 IEEE754 标准:float (32 = 1+ 8 + 23) 能表示的最大指数为 -126~127,而 2^126 / 2^127 ≈ 10^38,所以最多表示的指数范围是 -38~38;能表示的小数位数是 23 位(1.M),而 2^24 ≈ 1.7*10^7,所以能保证精度的位数为 7 位左右

    create table type_float (
      -- 不指定 M,D(有效位数,小数),默认为硬件所支持的最大值
      float_1 float,
      -- 整数 8 位,小数 2 位
      float_2 float(10,2)
    );
    
    -- 最终插入结果为 12345679.00(浮点数的精度问题暴露无遗)
    insert into type_float(float_2) values (12345678.90);
    
    -- 可以插入科学计数法
    insert into type_float(float_2) values (10e5);
    
    -- 最终插入结果为 100000000.00(浮点数自身导致的精度问题不会报错)
    insert into type_float(float_2) values (99999999.99);
    
    -- 整数越界报错
    insert into type_float(float_2) values (123456789.00);
    -- 四舍五入得到 99999999.99,不报错
    insert into type_float(float_2) values (99999999.994);
    
    -- 四舍五入得到 100000000.00,报错
    insert into type_float(float_2) values (99999999.995);
    

    MySQL浮点数和定点数_第1张图片

    MySQL浮点数和定点数_第2张图片

  2. 定点数:

    类型 字节数 signed范围 unsigned范围 描述
    decimal 自动分配
    每大概9个数就会分配4个字节
    与 (M, D) 有关 与 (M, D) 有关 保证数据精确的小数
    总长度 M <= 65
    小数位数 D <= 30
    # 定点数与浮点数类似,但不存在精度不足导致存储不准确的问题
    create table type_decimal (
      -- 不指定,相当于 (10, 0)
      decimal_1 decimal,
      -- 整数 8 位,小数 2 位
      decimal_2 decimal(10,2)
    );
    
    -- 插入结果准确,不会存在精度问题
    insert into type_decimal(decimal_2) values (12345678.90);
    
    -- 四舍五入得到 99999999.99,不报错
    insert into type_decimal(decimal_2) values (99999999.994);
    -- 四舍五入得到 100000000.00,报错
    insert into type_decimal(decimal_2) values (99999999.995);
    

结论:在对存储空间要求不是特别严格的情况下,能用定点数就绝不用浮点数

你可能感兴趣的:(mysql,数据库,sql)