当前位置:首页 > 机动车 >

decimal类型可以取负数么(decimal 可以存放多少位小数)

来源:原点资讯(www.yd166.com)时间:2024-01-01 04:15:12作者:YD166手机阅读>>

定点数类型

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

decimal类型可以取负数么,decimal 可以存放多少位小数(1)

其中:

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

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

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

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

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

decimal类型可以取负数么,decimal 可以存放多少位小数(2)

可以看到,在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位,如图所示:

decimal类型可以取负数么,decimal 可以存放多少位小数(3)

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

decimal类型可以取负数么,decimal 可以存放多少位小数(4)

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

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

decimal类型可以取负数么,decimal 可以存放多少位小数(5)

所以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)来说,M和D都是可选的,默认的M的值是10,默认的D的值是0,也就是说下列等式是成立的:

DECIMAL = DECIMAL(10) = DECIMAL(10, 0) DECIMAL(n) = DECIMAL(n, 0) 复制代码

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

decimal类型可以取负数么,decimal 可以存放多少位小数(6)

,

栏目热文

数据库decimal用法(mysqldecimal数据类型怎么设置)

数据库decimal用法(mysqldecimal数据类型怎么设置)

介绍 在设计数据库时,如果你要存储价格之类带小数点的数据,们一般比如价格,我会用decimal类型,不会考虑float...

2024-01-01 03:43:33查看全文 >>

decimal类型如何查询(decimal类型怎么用)

decimal类型如何查询(decimal类型怎么用)

MySQL DECIMAL数据类型用于在数据库中存储精确的数值。对于保持精确精度的列,我们通常使用DECIMAL数据类型...

2024-01-01 04:08:23查看全文 >>

decimal和bigdecimal什么区别(big decimal怎么比大小)

decimal和bigdecimal什么区别(big decimal怎么比大小)

优质文章,及时送达链接 | HikariCP来源 | www.jianshu.com/p/c81edc59546c# 前...

2024-01-01 04:18:33查看全文 >>

decimal数据类型和double的区别(doubledecimal和float的区别)

decimal数据类型和double的区别(doubledecimal和float的区别)

作者:极客小俊 一个专注于web技术的80后你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人!下表中规划了...

2024-01-01 03:51:52查看全文 >>

decimal和double的区别(bigdecimal 与double 区别)

decimal和double的区别(bigdecimal 与double 区别)

先用简单的代码展示一下Java代码:上面的代码主要的区别在于初始化BigDecimal时形参是Double、String...

2024-01-01 03:55:36查看全文 >>

python中decimal的用处(python decimal用法)

python中decimal的用处(python decimal用法)

在我们开发工作中浮点类型的使用还是比较普遍的,对于一些涉及资金金额的计算更是不能有丝毫误差,Python 的 Decim...

2024-01-01 04:25:18查看全文 >>

decimal是什么意思(decimal是什么数据类型)

decimal是什么意思(decimal是什么数据类型)

我们需要重新认识教材,教材里通常有一些我们看不见的内容。在小学数学教材里,这样的四边形没看见(图1、2),这样的空间四边...

2024-01-01 04:09:29查看全文 >>

dvi连接显示器没声音怎么解决(ipad连接显示器没有声音)

dvi连接显示器没声音怎么解决(ipad连接显示器没有声音)

现在大屏的液晶电视已经越来越流行,悬挂在墙上,又不占空间,体验的效果非常的带劲,所以现在年轻人买房装修,大屏液晶电视已...

2024-01-01 04:03:55查看全文 >>

dvi无信号怎么处理(当电脑dvi无信号该怎么办)

dvi无信号怎么处理(当电脑dvi无信号该怎么办)

控无信号通常是由于以下几种情况引起的:信号源故障、连接问题、设置错误等。以下是处理监控无信号问题的一般步骤: 1. **...

2024-01-01 04:13:47查看全文 >>

dvi带响声但是没信号(dvi无信号解决办法)

dvi带响声但是没信号(dvi无信号解决办法)

前两天写了一篇关于显卡接口的文章,文中提出dvi接口无法传输音频数据,但是网友指出来,dvi可以传输音频,那么事实究竟是...

2024-01-01 04:16:56查看全文 >>

文档排行