小工具知识网

当前位置: 首页 > 行业知识 > 【mysql】浮点类型

行业知识

【mysql】浮点类型

2026-11-12 01:16:09 来源:互联网转载

文章目录

  • 1. 类型介绍
  • 2. 数据精度说明
  • 3. 精度误差说明

    1. 类型介绍

    浮点类型

    • 浮点数和定点数类型的特点是可以处理小数,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOAT、DOUBLE、REAL。
    • FLOAT 表示单精度浮点数;
    • DOUBLE 表示双精度浮点数;
      • REAL默认就是 DOUBLE。如果把 SQL 模式设定为启用“REAL_AS_FLOAT”,那 么,MySQL 就认为 REAL 是 FLOAT。如果要启用“REAL_AS_FLOAT”,可以通过以下 SQL 语句实现:
        SET sql_mode = “REAL_AS_FLOAT”;

        问题1: FLOAT 和 DOUBLE 这两种数据类型的区别是什么?

        FLOAT 占用字节数少,取值范围小;DOUBLE 占用字节数多,取值范围也大。

        问题2: 为什么浮点数类型的无符号数取值范围,只相当于有符号数取值范围的一半,也就是只相当于有符号数取值范围大于等于零的部分呢?

        MySQL 存储浮点数的格式为:符号(S)、尾数(M)和 阶码(E)。因此,无论有没有符号,MySQL 的浮点数都会存储表示符号的部分。因此, 所谓的无符号数取值范围,其实就是有符号数取值范围大于等于零的部分。

        2. 数据精度说明

        对于浮点类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。

        • MySQL允许使用非标准语法(其他数据库未必支持,因此如果涉及到数据迁移,则最好不要这么用):FLOAT(M,D)或DOUBLE(M,D)。这里,M称为精度,D称为标度。(M,D)中 M=整数位+小数位,D=小数位。 D FROM test_double2;+---------------+-----------+| SUM(f1) = 1.1 | 1.1 = 1.1 |+---------------+-----------+| 0 | 1 |+---------------+-----------+1 row in set (0.00 sec)

          • 查询结果是 1.0999999999999999。看到了吗?虽然误差很小,但确实有误差。 你也可以尝试把数据类型改成 FLOAT,然后运行求和查询,得到的是, 1.0999999940395355。显然,误差更大了。
          • 那么,为什么会存在这样的误差呢?问题还是出在 MySQL 对浮点类型数据的存储方式上。
          • MySQL 用 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625,用二进制来表达,就是 1001.101,或者表达成 1.001101×2^3。如果尾数不是 0 或 5(比如 9.624),你就无法用一个二进制数来精确表达。进而,就只好在取值允许的范围内进行四舍五入。
          • 在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。 同时,在一些对精确度要求较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至是造成不可挽回的损失。那么,MySQL 有没有精准的数据类型呢?当然有,这就是定点数类型:DECIMAL。

上一篇:告别蜜源,如何应对?全面解析你的选择!

下一篇:如何测试连接服务器的网速?