MySQL浮点数和定点数

  1. 浮点型:

    类型字节数signed范围unsigned范围描述
    float4(-3.4E+38, 3.4E+38)0 和 (1.1E-38, 3.4E+38)单精度浮点数
    double8(-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);
    

    float1

    float2

  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);
    

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值