mysql中的生日应该是什么类型_MySQL中的定点数类型

上一篇文章我们唠叨了浮点数,知道了浮点数存储小数是不精确的。本篇继续唠叨一下MySQL中的另一种存储小数的方式 —— 定点数。浮点数文章闪现:

  • 什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼

定点数类型

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

7336ac96992bdc04bb5cba36f08e871f.png

其中:

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

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

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

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

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

类型取值范围
DECIMAL(4, 1)-999.9~999.9
DECIMAL(5, 1)-9999.9~9999.9
DECIMAL(6, 1)-99999.9~99999.9
DECIMAL(4, 0)-9999~9999
DECIMAL(4, 1)-999.9~999.9
DECIMAL(4, 2)-99.99~99.99

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

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

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

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

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

    29e92c074a7be7d1e8d41adeab44ba87.png

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

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

    组中包含的十进制位数占用存储空间大小(单位:字节)
    1或21
    3或42
    5或63
    7或8或94

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

    • 第1组包含3个十进制位,需要使用2个字节存储。

    • 第2组包含9个十进制位,需要使用4个字节存储。

    • 第3组包含4个十进制位,需要使用2个字节存储。

  • 将转换完成的比特位序列的最高位设置为1。

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

1 234567890 1234

也就是:

  • 第1组中包含整数1

  • 第2组中包含整数234567890

  • 第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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python怎么制作图像_python数字图像处理(5):图像的绘制

实际上前面我们就已经用到了图像的绘制,如:io.imshow(img)这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据。因此,我们也可以这样写:importmatplotlib.pyplot …

axios代理跨域 cli4_vuecli 3.0之跨域请求代理配置及axios路径配置 莫小龙

vue-cli 3.0之跨域请求代理配置及axios路径配置问题:在前后端分离的跨域请求中,报跨域问题配置:vue.config.js:module.exports {runtimeCompiler: true,publicPath: /, // 设置打包文件相对路径devServer: {// open: process.pla…

string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...

String和StringBuffer、StringBuilder的区别可变性简单的来说:String 类中使用 final 关键字字符数组保存字符串,private final char value[],所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuild…

python去年软件排行_2017年编程语言排行榜,Python位居榜首(C语言需求最大)

最近IEEE Spectrum 发布了编程语言交互式排行榜,为很多学习代码的朋友们详解各类代码语言的需求和占有率。为学习代码的朋友们能更加重视哪一种编程语言而有一个明确的方向。下面排行榜123网为你公布2017年编程语言排行榜,Python位居榜首(C语言需求最大)。2017年编程…

mysql test数据库_mysql数据库test

Re介绍一下CentOS下MySQL数据库的安装与配置方法MySQL数据库配置的具体步骤:1、编辑MySQL的配置文件,使用vi /etc/my.cnf[rootsample ~]# vi /etc/my.cnf  ← 编辑MySQL的配置文件[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock# Defau…

mysql 升级 openssl_【1分钟教程】LNMP架构应用实战 Openssl升级操作

由于实际生产环境需求,需要将LNMP环境中的openssl版本升级至目前最新版本openssl-1.1.0c,这玩意升级还真的不是一般的麻烦,由于它与系统各种服务都有相关的联系,比如ssh服务等,因此,升级非常的繁琐,所以今天…

miui秒解bl锁_MIUI12解锁bl篇(原谅我的过失,接上篇文章)

求原谅真心求原谅由于我的疏忽,上期教程不完整,对大家造成不便在这里给大家真诚道歉!对不起!请收下我的膝盖!!!我的上个教程小米手机MIUI系统降级任意版本通用教程,MIUI12→MIUI9因为…

腐蚀rust服务器命令_【使用 Rust 写 Parser】2. 解析Redis协议

系列所有文章https://zhuanlan.zhihu.com/p/115017849​zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/139387293​zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/146455601​zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/186217695​zhuanlan.zhihu.com在基本熟悉 n…

python中dic_python之dic {字典}(重要指数*****)

1. 什么是字典{name: 汪峰, age: 18} 键:值 别的语言键值对数据键: 必须是可哈希(不可变的数据类型),并且是唯一的值: 任意可以保存任意类型的数据字典是无序的python3.6版本以上,默认定义了顺序,python3.5以下是随机显示不能进⾏切片⼯作. 它只能通过key来获取dict中的数据字典…

python装饰器带参数函数二阶导数公式_一文搞定Python装饰器,看完面试不再慌

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是Python专题的第12篇文章,我们来看看Python装饰器。一段囧事差不多五年前面试的时候,我就领教过它的重要性。那时候我Python刚刚初学乍练,看完了廖雪…

centos7源码安装mysql报错_CentOS7 下源码安装MySQL数据库 8.0.11

本文主要向大家介绍了CentOS7 下源码安装MySQL数据库 8.0.11,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。CentOS7 下源码安装MySQL 8.0.11系统环境:CentOS7, 内核:Linux 3.10.0-862.el7.x86_64如果…

python全排列问题_Python基于回溯法子集树模板解决全排列问题示例

本文实例讲述了Python基于回溯法子集树模板解决全排列问题。分享给大家供大家参考,具体如下:问题实现 a, b, c, d 四个元素的全排列。分析这个问题可以直接套用排列树模板。不过本文使用子集树模板。分析如下:一个解x就是n个元素的一种排列&a…

file js new 传到后台_js 图片上传传给后台的3种格式

$("#imgfile").change(function () {var formData new FormData();$.each($(#imgfile)[0].files, function (i, file) {formData.set(idcard, file); //idcard 字段 根据自己后端接口定});//processData: false, contentType: false,多用来处理异步上传二进制文件。…

usbserialcontroller驱动安装不了_win10-有NVIDIA独显提示未安装控制面板的离线安装方式...

最近越来越多的用户反映NVIDIA显卡驱动设置不了啦,找不到NVIDIA显卡的控制面板。 也不知道NVIDIA在什么版本开始驱动安装包就不自带NVIDIA显卡控制面板了。 全新安装的显卡驱动就没有控制面板;或者Windows 10自带更新了显卡新版驱动后导致没有。 每次带N…

mysql 多实例 独立配置文件_三、安装配置多实例MYSQL5.6-多独立配置文件方法

三、安装配置多实例MYSQL5.6-多独立配置文件方法1、准备工作检查操作系统版本、内核版本、selinux是否关闭、防火墙策略、IP地址、主机名配置、host表配置、yum配置上传cmake、mysql5.6软件包具体步骤参考源码安装mysql-单实例配置文档2、安装cmake软件2.1 安装编译软件环境[[e…

python做什么模型_主题模型初学者指南[Python]

引言近年来涌现出越来越多的非结构化数据,我们很难直接利用传统的分析方法从这些数据中获得信息。但是新技术的出现使得我们可以从这些轻易地解析非结构化数据,并提取出重要信息。主题模型是处理非结构化数据的一种常用方法,从名字中就可以看…

python实现队列_Python学习教程:用队列实现栈

接着上一期跟大家说的用栈实现队列,这期的Python学习教程跟大家讲用队列实现栈题目:使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空Implement the following operati…

vue 点击li 中的img 怎么不冒泡_Vue全解

一.Vue实例内存图:1.把Vue的实例命名为vm,vm对象封装了对视图的所有操作包括数据读写、事件绑定、DOM更新2.vm的构造函数是Vue,按照ES6的说法vm所属的类是Vue3.options是new Vue的参数一般称为选项或构造选项1.options里面有什么英文文档搜op…

python布局管理_Python基础=== Tkinter Grid布局管理器详解

本文转自:https://www.cnblogs.com/ruo-li-suo-yi/p/7425307.html 箬笠蓑衣Grid(网格)布局管理器会将控件放置到一个二维的表格里。主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。注意:不要试图在一个主…

python面向对象类_python面向对象-类和对象

一. 类的定义class类名():代码#定义类classWasher():defwash(self):print("洗衣服")注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯。二. 创建对象对象名 类名()#创建对象w Washer()#调用方法w.wash() #洗衣服三. selfself指的是调用…