关于decimal非常浅显的学习与整理

关于,decimal,非常,浅显,学习,整理 · 浏览次数 : 65

小编点评

**关于 decimal 数据类型** **定义:** - 精确数值类型,用于存储小数。 - 通常用于需要精确计算和存储小数的场景。 **主要属性:** - **精度:** 指数据总位数。 - **范围:** 指数据的小数位数。 **数据存储方式:** - 在计算机中,通常以 **整数**形式存储。 - 整数使用固定的小数点位置来表示数值。 **精度的影响:** - 精度越高,小数位数越少。 - 对于需要精確計算和存储的小数,选择 **decimal** 数据类型。 **与其他数据类型比较:** - **float** 和 **double** 是具有小数部分的数值类型,但它们不是 **decimal** 的子类型。 - **decimal** 类型比 **float** 和 **double** 更精确。 **性能:** - **decimal** 数据类型通常比 **float** 和 **double** 更快。 - 这是因为它使用整数存储,无需使用浮点数的复杂运算。

正文

关于decimal非常浅显的学习与整理


背景知识

整数,小数,浮点,定点
整数(Integer)是没有小数部分的数值,可以是正数、负数或零。在计算机中,整数通常以二进制形式存储。

小数(Decimal)是带有小数部分的数值。小数可以是有限的,也可以是无限循环的。在计算机中,小数通常以浮点数或定点数的形式存储。

浮点数(Floating-point)是一种用于表示带有小数部分的数值的方法。浮点数使用科学计数法表示,包括一个有效数字和一个指数。在计算机中,浮点数通常使用IEEE 754标准进行存储。

定点数(Fixed-point)是一种用于表示带有小数部分的数值的方法。定点数使用固定的小数点位置来表示数值。在计算机中,定点数通常以整数形式存储,并使用一个固定的缩放因子来确定小数点位置。

关于金额类型

decimal 其实在不同的编程语言, 不同的数据库里面的实现和使用都是不一样的
但是有一点是明确的:
浮点类型, 不管是float还是double 都是非精确数值类型
都会有各种除不尽的尾差问题. 

但是decimal 这种数值类型, 是精确的数值. 

decimal是一种数据类型,用于存储精确的十进制数值。它通常用于需要精确计算和存储小数的场景,例如财务应用程序或需要保留小数位数的计算。
在大多数编程语言和数据库系统中,decimal类型可以指定精度和范围。精度表示数据的总位数,而范围表示小数的小数位数。例如,decimal(10, 2)表示精度为10,小数位数为2的decimal类型。

尾差的一个展示

参照网站: https://www.cnblogs.com/danielzzz/p/16824214.html

CREATE TABLE test_float(
`f1` FLOAT,
`f2` DOUBLE,
`f3` DEC(10,2)
);

INSERT INTO test_float(f1,f2,f3) VALUES(0.47,0.47,0.47),(0.44,0.44,0.44),(0.19,0.19,0.19);

SELECT SUM(f1),SUM(f2),SUM(f3) FROM test_float;

测试结果为:
SUM(f1)             	SUM(f2)	               SUM(f3)
1.0999999940395355	1.0999999999999999	1.10

发现只有decimal 才可以精确表示数值. float和double 其实都是有小数位数的. 

关于decimal的数据库存储

自己查询了不少资料, 发现不同数据库, 比如MySQL和SQLServer 都不一样. 
MySQL 貌似采用int 类型存储 9位精确数字. 
也就是很多资料里面提到的 四个字节存储 9个数字. 
但是SQLServer的存储模式就是 1个字节存储连个数字. 

MySQL应该会有一个单独的表示符号的布尔类型的设置
整数部分和小数部分是单独进行存储. 

SQLServer的存储模式暂时还不是很清楚. 

初步怀疑 MySQL其实是采用 int类型 能够表示 42亿 也就是部分10位数的情况 
退而求其次用来表示 9位精确数字. 

SQLServer的模式 其实就是 一个字节,可以表示 256个数字. 
退而求其次表示 99 这个最大的两位数值. 

所以每个字节表示两位数. 用来进行精确数字的存储. 

但是MySQL与SQLserver 可能还比较相似. 但是与CK的存储模式可能还不一样. 

需要说明大部分资料都确认, decimal的性能是数值类型里面最差的. 除非是金额汇率等必须精确的数字

整数可以用int. 逼不得已在用decimal 

自己查了不少资料, 本来想dump 不分 raw data 但是发现没有达到自己的预期目标. 

所以几天仅是简单的进行一些汇总. 还需要较多的时间研究底层的存储模式. 

看到了 ibd2sdi 以及hexedit等工具. 但是都没有达到自己的预期. 

因为是一个周天, 大部分时间用于陪伴自己的孩子了. 学习的时间不是很充足. 

搜易今天仅是一个简单的学习与整理. 后续还需要继续探究和提高. 

阿里上面一个说明-未看懂

# 其实原理看明白了. 但是不知道数据是怎么来的
# 感觉mysql的确做的比较简单.可能浪费了部分存储空间. 但是处理起来比较简单.
# 所有的性能其实都是在调和和折中. 自己哪方面强. 哪方面可能就要多出点力. 
# 数据库与人生不一样, 强的必须得像低的低头. 人生是长板决定你的上限. 计算机是短板决定你的上限.

Synopsis
Decimal2bin ()
From-value to convert
To-points to buffer Where string representation shoshould be stored
Precision/scale-see decimal_bin_size () below

Note
The buffer is assumed to be of the size decimal_bin_size (precision, scale)

Return Value
E_dec_ OK/e_dec_truncated/e_dec_overflow

Description
For storage decimal numbers are converted to the "binary" format.

This format has the following properties:
1. Length of the binary representation depends on the {precision, scale}
As provided by the caller and not on the intg/frac of the decimal
Convert.
2. Binary representations of the same {precision, scale} can be compared
With memcmp-with the same result as decimal_cmp () of the original
Decimals (not taking into account possible precision loss
Conversion ).

This binary format is as follows:
1. First the number is converted to have a requested precision and scale.
2. Every full dig_per_dec1 digits of intg part are stored in 4 bytes
As is
3. The first intg % dig_per_dec1 digits are stored in the specified CED
Number of bytes (enough bytes to store this number of digits-
See dig2bytes)
4. Same for frac-full decimal_digit_t's are stored as is,
The last frac % dig_per_dec1 digits-in the specified ced number of bytes.
5. If the number is negative-every byte is inversed.
5. The very first bit of the resulting byte array is inverted (because
Memcmp compares unsigned bytes, see property 2 above)

Example:

1234567890.1234

Internally is represented as 3 decimal_digit_t's

1 234567890 123400000

(Assuming we want a binary representation with precision = 14, scale = 4)
In hex it's

00-00-00-01 0d-fb-38-d2 07-5a-ef-40

Now, middle decimal_digit_t is full-It stores 9 decimal digits. It goes
Into binary representation as is:

...... 0d-fb-38-d2 ............

First decimal_digit_t has only one decimal digit. We can store one digit in
One byte, no need to waste four:

01 0d-fb-38-d2 ............

Now, last digit. It's 123400000. We can store 1234 in two bytes:

01 0d-fb-38-d2 04-d2

So, we 've packed 12 bytes number in 7 bytes.
And now we invert the highest bit to get the final result:

81 0d FB 38 D2 04 D2

And for-1234567890.1234 it wocould be

7E F2 04 37 2D FB 2D

This article is an English version of an article which is originally in the Chinese language on aliyun.com and is provided for information purposes only. This website makes no representation or warranty of any kind, either expressed or implied, as to the accuracy, completeness ownership or

与关于decimal非常浅显的学习与整理相似的内容:

关于decimal非常浅显的学习与整理

# 关于decimal非常浅显的学习与整理 ## 背景知识 ``` 整数,小数,浮点,定点 整数(Integer)是没有小数部分的数值,可以是正数、负数或零。在计算机中,整数通常以二进制形式存储。 小数(Decimal)是带有小数部分的数值。小数可以是有限的,也可以是无限循环的。在计算机中,小数通常

[转帖]MySQL数据类型(decimal的存储大小)

本来还以为MySQL的数据类型挺简单的,没想到竟然有很多坑,容我仔细道来 MySQL数据类型 整数类型(注意是字节) 浮点型(重点关注decimal) 字符型(注意这是4.x版本的定义,5.x以后已经将其中的字节转换成字符了) 日期类型 MySQL日期类型表示方法与字符串的表示方法相同(用单引号括起

关于领域驱动设计,大家都理解错了

翻遍整个互联网,我发现,关于领域驱动设计,大家都**理解错了**。 今天,我们尝试通过一篇文章的篇幅,给大家展示一个完全不同的视角,把“领域驱动设计”这六个字解释清楚。 ## 领域驱动设计学习资料现状 领域驱动设计的概念提出已经有20年的时间了,整个互联网充斥着大量书籍、文章和视频教程,这里我列举几

关于docker-compose up -d 出现超时情况处理

由于要搭建一个ctf平台,用docker一键搭建是出现超时情况 用了很多办法,换源,等之类的一样没办法,似乎它就是只能用官方那个一样很怪。 只能用一种笨办法来处理了,一个个pull。 打个比如: 打开相对应docker-compose.yml文件 可以看到image就是需要去下载的。那么此时你就可以

关于 KL 散度和变分推断的 ELBO

ELBO 用于最小化 q(z|s) 和 p(z|s) 的 KL 散度,变成最大化 p(x|z) 的 log likelihood + 最小化 q(z|s) 和先验 p(z) 的 KL 散度。

关于面试被面试官暴怼:“几年研究生白读” 的前因后果

中午一个网友来信说自己和面试官干起来了,看完他的描述真是苦笑不得,这年头是怎么了,最近互联网CS消息满天飞,怎么连面试官都SB起来了呢? 大概是这样的:这位网友面试时被问及了Serializable接口的底层实现原理,因为这是一个标识性的空接口,大部分同学在学习时都秉持着会用就行(说实话,Build

关于vue中image控件,onload事件里,event.target 为null的奇怪问题探讨

废话不多说(主要文笔比较差),直接上代码 一个简单的demo,如下 vue代码 imgLoaded(e) { deb

漏洞复现之CVE-2012-1823(PHP-CGI远程代码执行)

关于CGI知识点 CGI模式下的参数: -c 指定php.ini文件的位置 -n 不要加载php.ini文件 -d 指定配置项 -b 启动fastcgi进程 -s 显示文件源码 -T 执行指定次该文件 -h和-? 显示帮助 题目如下图,没有什么发现 目录扫描一下 dirsearch -u http:

关于正在开发中的DjangoStarter v3版本

前言 最近做的这个项目大量使用了 python 及其相关的生态,因此自然而然选择了我的 DjangoStarter 作为后端框架 之前 v2 版本是用 RestFramework 做接口的,后面我试用了一次 django-ninja 之后就喜欢这种类似 FastApi 的写接口方式 正所谓天下苦 d

关于去除图片上的水印

现在有很多去除水印的工具,但基本上都需要你花钱。作为资深白嫖党,想让我花钱,那是不可能的。 于是我做了下research(search, search, research…),我发现现在的“去水印”基本上都是一个思路:利用图像修复算法。把有水印的地方看作是图像损坏的地方,用相邻像素替换那些损坏的地方