文章目录

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

浮点类型

1. 类型介绍

  • 浮点数定点数类型的特点是可以处理小数,你可以把整数看成小数的一个特例。因此,浮点数和定点数的使用场景,比整数大多了。 MySQL支持的浮点数类型,分别是 FLOAT、DOUBLE、REAL

  • FLOAT 表示单精度浮点数;

  • DOUBLE 表示双精度浮点数;

  • REAL默认就是 DOUBLE。如果把 SQL 模式设定为启用“REAL_AS_FLOAT”,那 么,MySQL 就认为 REALFLOAT。如果要启用“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<=M<=255,0<=D<=30。

    例如,定义为FLOAT(5,2)的一个列可以显示为-999.99-999.99。如果超过这个范围会报错。

  • FLOAT和DOUBLE类型在不指定(M,D)时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示。

  • 说明:浮点类型,也可以加UNSIGNED,但是不会改变数据范围,例如:FLOAT(3,2) UNSIGNED仍然只能表示0-9.99的范围。

  • 不管是否显式设置了精度(M,D),这里MySQL的处理方案如下:

    • 如果存储时,整数部分超出了范围,MySQL就会报错,不允许存这样的值

    • 如果存储时,小数点部分若超出范围,就分以下情况:

      • 若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。例如在FLOAT(5,2)列内插入999.009,近似结果是999.01。
      • 若四舍五入后,整数部分超出范围,则MySQL报错,并拒绝处理。如FLOAT(5,2)列内插入999.995和-999.995都会报错。
  • 从MySQL 8.0.17开始,FLOAT(M,D) 和DOUBLE(M,D)用法在官方文档中已经明确不推荐使用,将来可能被移除。另外,关于浮点型FLOATDOUBLEUNSIGNED也不推荐使用了,将来也可能被移除。

  • 举例

CREATE TABLE test_double1(
f1 FLOAT,
f2 FLOAT(5,2),
f3 DOUBLE,
f4 DOUBLE(5,2)
);DESC test_double1;

INSERT INTO test_double1(f1, f2)
VALUES(123.45,123.45);SELECT * FROM test_double1;

  • 存在四舍五入问题
INSERT INTO test_double1(f3,f4)
VALUES(123.45,123.456); #存在四舍五入

  • 超出范围,因为 f4(5,2),可以得知 整数位:3,小数位:21234.456 超出整数位的访问了
INSERT INTO test_double1(f3,f4)
VALUES(123.45,1234.456);

  • 小数位超过就四舍五入,整数位超了就报错了

3. 精度误差说明

浮点数类型有个缺陷,就是不精准。下面我来重点解释一下为什么 MySQL 的浮点数不够精准。比如,我们设计一个表,有f1这个字段,插入值分别为0.47,0.44,0.19,我们期待的运行结果是:0.47 + 0.44 + 0.19 = 1.1。而使用sum之后查询:

CREATE TABLE test_double2(
f1 DOUBLE
);INSERT INTO test_double2
VALUES(0.47),(0.44),(0.19);
mysql> SELECT SUM(f1)-> FROM test_double2;
+--------------------+
| SUM(f1)            |
+--------------------+
| 1.0999999999999999 |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT SUM(f1) = 1.1,1.1 = 1.1-> 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

【mysql】浮点类型相关推荐

  1. mysql 浮点类型和定点_mysql 中的浮点和定点类型

    前面一段实验是引用别人的,后面作了一点补充 MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如 float(7,4)的 ...

  2. MySQL数据类型--------浮点类型实战

    1. 背景 * MySQL支持的浮点类型中有单精度类型(float), 双精度类型(double),和高精度类型(decimal),在数字货币类型中推荐使用高精度类型(decimal)来进行应用. * ...

  3. mysql中的double类型_MySQL中float、double、decimal三个浮点类型的区别与总结!

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 个人博客: cnblogs.com 前端h ...

  4. mysql浮点数据怎么_MySQL数据浮点类型的实际应用操作

    MySQL数据浮点类型的实际应用操作 发布时间:2020-06-03 14:43:58 来源:51CTO 阅读:193 作者:三月 下文主要给大家带来MySQL数据浮点类型的实际应用操作,希望这些内容 ...

  5. mysql zerofill 性能_比较详细的MySQL字段类型说明

    由MySQL支持的列类型列在下面.下列代码字母用于描述中: M 指出最大的显示尺寸.最大的合法的显示尺寸是 255 . D 适用于浮点类型并且指出跟随在十进制小数点后的数码的数量.最大可能的值是30, ...

  6. php数据库字段类型,mysql 字段类型说明

    mysql 字段类型说明 更新时间:2007年04月27日 00:00:00   作者: MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用 ...

  7. mysql字段类型、范围详解

    TINYINT:有符号的范围是-128至127,无符号的范围是0到255,2的8次方[存储大小为 1 字节大小] SMALLINT: 有符号的范围是-32768至32767,无符号的范围是0到6553 ...

  8. mysql 数值类型 长度_mysql中的数据类型的长度

    位,字节,字 --------------------------------------------------------------- 8位(bit)=1字节(Byte),1024字节=1KB: ...

  9. mysql高精度类型_mysql中常见的数据类型

    2.浮点数 如果希望保证值比较准确,推荐使用定点数数据类型.MySql中的浮点类型有float,double和real.他们定义方式为:FLOAT(M,D) . REAL(M,D) . DOUBLE ...

  10. mysql 优化 类型_MySQL数据类型的优化选择

    整数类型: Tinyint-8 Smallint-16 Mediumint-24 Int-32 Bigint-64 实数类型(带有小数部分的数字) Float-4/double-8:浮点 Decima ...

最新文章

  1. 自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR)
  2. Can't connect to MySQL server on 'localhost' (10061)的解决办法!
  3. 【MM模块】Physics Inventory 库存盘点差异
  4. dict过滤 python_关于python:过滤dict以只包含某些键?
  5. 科大星云诗社动态20210810
  6. devexpress卸载不干净_最好用的卸载工具,清理彻底,专治各种流氓软件
  7. cocos2d JS 源生js实现each方法
  8. 队列queue中的常用函数
  9. MT7621搭载openwrt实现U盘等设备自动挂载
  10. 6,Java毕向东百度云盘
  11. pytorch seq2seq模型中加入teacher_forcing机制
  12. 电影数据库开发设计——基于jsp(使用eclipse-jee,mysql-front)
  13. 让英文和数字随机生成java_Java生成随机字母和数字
  14. tcping : ping ip地址+端口号
  15. 漂亮的梦幻图,可用来做背景图(60张左右)
  16. 数学建模算法与应用【模糊综合评价算法】
  17. 【转载】几封读者来信的回复
  18. 移动安全事件总结情况说明
  19. mysql DISTINCT去重,返回去重后的所有字段
  20. vue 播报警报声_启发了一个简单的Vue 2警报组件SweetAlert

热门文章

  1. 网站建设的费用一般与功能要求是成正比的
  2. 美化桌面软件测试面试题,软件测试面试题的经典逻辑题
  3. Kevgir靶机渗透——弱口令爆破
  4. DDE学习1、DDE的原理和基本特点简介_马鸿凯_新浪博客
  5. 中文可以声明java类吗_JSP中可以声明基本类型和结构类型变量,但不能申明类,类必须放在JavaBean中。...
  6. 实现京东商城地址选择效果(效果还挺一致的)
  7. 上海车牌拍卖服务器响应时间,上海拍牌技巧:”48秒+700” 最晚出价为55秒
  8. 更好的Google Glass:棱镜变长、Intel Atom处理器和外置电池组
  9. 魔镜mirror安卓版打不开_魔镜Mirror
  10. SpringBoot+Vue项目的PDF导出及给PDF文件盖章的功能示例