定点数类型

正因为用浮点数表示小数可能会有不精确的情况,在一些情况下我们必须保证小数是精确的,所以设计MySQL的大叔们提出一种称之为定点数的数据类型,它也是存储小数的一种方式:

其中:

  • M表示该小数最多需要的十进制有效数字个数。

注意是有效数字个数,比方说对于小数-2.3来说有效数字个数就是2,对于小数0.9来说有效数字个数就是1

  • D表示该小数的小数点后的十进制数字个数。

这个好理解,小数点后有几个十进制数字,D的值就是什么。

举个例子看一下,设置了MD的单精度浮点数的取值范围的变化:

可以看到,在D相同的情况下,M越大,该类型的取值范围越大;在M相同的情况下,D越大,该类型的取值范围越小。当然,MD的取值也不是无限大的,M的取值范围是1~255D的取值范围是0~30,而且D的值必须不大于MMD都是可选的,如果我们省略了它们,那它们的值按照机器支持的最大值来存储。

我们说定点数是一种精确的小数,为了达到精确的目的我们就不能把它转换成二进制小数之后再存储(因为有很多十进制小数转为二进制小数后需要进行舍入操作,导致二进制小数表示的数值是不精确的)。其实转念一想,所谓的小数只是把两个十进制整数用小数点分割开来而已,我们只要把小数点左右的两个十进制整数给存储起来,那不就是精确的了么。比方说对于十进制小数2.38来说,我们可以把这个小数的小数点左右的两个整数,也就是238分别保存起来,那么不就相当于保存了一个精确的小数么,这波操作是不是很6。

当然事情并没有这么简单,对于给定M、D值的DECIMAL(M, D)类型,比如DEMCIMAL(16, 4)来说:

  • 首先确定小数点左边的整数最多需要存储的十进制位数是12位,小数点右边的整数需要存储的十进制位数是4位,如图所示:

  • 从小数点位置出发,每个整数每隔9个十进制位划分为1组,效果就是这样:

从图中可以看出,如果不足9个十进制位,也会被划分成一组。

  • 针对每个组中的十进制数字,将其转换为二进制数字进行存储,根据组中包含的十进制数字位数不同,所需的存储空间大小也不同,具体见下表:

所以DECIMAL(16, 4)共需要占用8个字节的存储空间大小,这8个字节由下边3个部分组成:

  1. 第1组包含3个十进制位,需要使用2个字节存储。
  2. 第2组包含9个十进制位,需要使用4个字节存储。
  3. 第3组包含4个十进制位,需要使用2个字节存储。
  • 将转换完成的比特位序列的最高位设置为1。

这些步骤看的有一丢丢懵逼吧,别着急,举个例子就都清楚了。比方说我们使用定点数类型DECIMAL(16, 4)来存储十进制小数1234567890.1234,这个小数会被划分成3个部分:

1 234567890 1234

也就是:

  1. 第1组中包含整数1。
  2. 第2组中包含整数234567890。
  3. 第3组中包含整数1234。

然后将每一组中的十进制数字转换成对应的二进制数字:

  • 第1组占用2个字节,整数1对应的二进制数就是(字节之间实际上没有空格,只不过为了大家理解上的方便我们加了一个空格):

    00000000 00000001

    二进制看起来太难受,我们还是转换成对应的十六进制看一下:

    0x0001
  • 第2组占用4个字节,整数234567890对应的十六进制数就是:
    0x0DFB38D2
  • 第3组占用2个字节,整数1234对应的十六进制数就是:
    0x04D2

    所以将这些十六进制数字连起来之后就是:

    0x00010DFB38D204D2

    最后还要将这个结果的最高位设置为1,所以最终十进制小数1234567890.1234使用定点数类型DECIMAL(16, 4)存储时共占用8个字节,具体内容为:

    0x80010DFB38D204D2

    有的朋友会问,如果我们想使用定点数类型DECIMAL(16, 4)存储一个负数怎么办,比方说-1234567890.1234,这时只需要将0x80010DFB38D204D2中的每一个比特位都执行一个取反操作就好,也就是得到下边这个结果:

    0x7FFEF204C72DFB2D

    从上边的叙述中我们可以知道,对于DECIMAL(M, D)类型来说,给定的MD的值不同,所需的存储空间大小也不同。可以看到,与浮点数相比,定点数需要更多的空间来存储数据,所以如果不是在某些需要存储精确小数的场景下,一般的小数用浮点数表示就足够了。

对于定点数类型DECIMAL(M, D)来说,MD都是可选的,默认的M的值是10,默认的D的值是0,也就是说下列等式是成立的:

DECIMAL = DECIMAL(10) = DECIMAL(10, 0)
DECIMAL(n) = DECIMAL(n, 0)

另外M的范围是1~65D的范围是0~30,且D的值不能超过M

你可能不知道的MySQL中的定点数类型相关推荐

  1. mysql的定点数_在MySQL中,定点数类型只有DECIMAL类型。

    [单选题]南瓜 [单选题]下列选项中,修改字段数据类型的的基本语法格式是 [判断题]身韵是从戏曲舞蹈和武术身法中提取的艺术精华. [单选题]啤酒的营养成分十分丰富,人们把它称为 [单选题]啤酒的营养成 ...

  2. MySQL中的浮点数类型和定点数类型

    文章目录 1 MySQL中的浮点数类型和定点数类型 1 MySQL中的浮点数类型和定点数类型 数据表中用浮点数类型和定点数类型来表示小数.浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DO ...

  3. 数组在mysql中是什么类型_MySQL 中的数据类型介绍

    1.概述 要了解一个数据库,我们也必须了解其支持的数据类型. MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型 字符串类型 时间日期类型 另一类是几何数据类型,用的不多,也没多介绍.  ...

  4. MySQL中的二进制类型

    文章目录 1 MySQL中的二进制类型 1.1 二进制类型概览 1.2 binary和varbinary类型 1.3 bit类型 1.4 blob类型 1.5 实战建议 1 MySQL中的二进制类型 ...

  5. MySQL中的Text类型

    文章目录 1 MySQL中的Text类型 1 MySQL中的Text类型 TEXT类型是一种特殊的字符串类型,包括TINYTEXT.TEXT.MEDIUMTEXT和LONGTEXT,其长度和存储空间的 ...

  6. MySQL中的整数类型

    文章目录 1 MySQL中的整数类型 1.1 整数类型简介 1.2 整数类型的附带属性 1 MySQL中的整数类型 1.1 整数类型简介 整数类型是数据库中最基本的数据类型.标准SQL中支持INTEG ...

  7. mysql中的字段类型

    Mysql中的字段类型 MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类 ...

  8. 面试官问:mysql中时间日期类型和字符串类型的选择

    摘要:MySQL中有多种表示时间日期的数据类型,主要有YEAR.TIME.DATE.DATETIME.TIMESTAMP等 本文分享自华为云社区<一针见血,mysql中时间日期类型和字符串类型的 ...

  9. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...

    ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...

最新文章

  1. 你真的会玩SQL吗?Case的用法(转)
  2. 自动管理Windows2003好用的“远程桌面”
  3. USART中的SART_IT_RXNE,USART_IT_TC,USART_IT_TXE
  4. UA OPTI570 量子力学4 带不含时的标量势的粒子的薛定谔方程
  5. php如何记录访问请求类型,检测PHP中的请求类型(GET、POST、PUT或DELETE)
  6. hotspot 垃圾收集器_HotSpot增量Java垃圾收集器
  7. 如果你是IT技术人员,请思考这15个问题
  8. 诺基亚贝尔完成5G毫米波NR-DC和200MHz载波带宽测试
  9. 数据结构与算法之链式栈
  10. OpenCV-绘制旋转矩形
  11. HW浮动静态路由及负载均衡
  12. 欢迎使用云-“您的Apple ID已被禁用。”
  13. 三菱数据移位指令_三菱FX系列PLC循环与移位类指令的使用方法
  14. JSP导入导出Excel功能
  15. ps怎么把黑白照片变成彩色?ps把儿童黑白照变彩色教程
  16. 处在腾讯音乐与网易云音乐夹缝中,库客音乐上市能否奏响主旋律?
  17. 【uniapp】 读取手机通讯录权限
  18. Unity游戏开发工具的下载与安装
  19. 音视频基础+ffmpeg原理(视频基础知识)
  20. 防火墙和上网行为管理组网中位置前后关系

热门文章

  1. 仿生技术能应用于人工智能吗?
  2. redis scan的使用方法
  3. display属性介绍
  4. ZGC、Shenandoah与Oracle GraalVM
  5. 一份 “内卷”面试题跟答案,让我年初跳槽14K 变成了 28K
  6. Squire编辑器源码解读
  7. GeoMesa源码学习 (2):创建Schema并导入数据
  8. 35岁程序员被裁后找了6份兼职,晒出收入网友:“打工皇帝”
  9. java 偏向锁 重偏向_锁原理:偏向锁、轻量锁、重量锁
  10. 安卓防盗软件_开学 | 开学季手机防盗