源码 | 为金融场景而生的数据类型:Numeric

本文探讨了金融场景下对数据精度的高要求,以 PostgreSQL 的 Numeric 数据类型为例,介绍了 Numeric 的精度、语法、特殊值以及 SQL 中的处理。文章详细解析了 Numeric 的内存计算结构和磁盘存储结构,包括 NumericLong、NumericShort 结构体,以及 NumericData 的内存布局,阐述了数据在内存和磁盘间的转换过程,并预告了下期将分析 Numeric 的计算原理和精度损失问题。
摘要由CSDN通过智能技术生成

高日耀 资深数据库内核研发

毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),现主要负责 MySQL 系列产品内核开发(青云科技)。

笔者曾做过数据库 Data Type 相关的设计和从 0 到 1 的源码实现,对 Numeric(与 Decimal 等价,都是标准 SQL 的一部分), Datetime, Timestamp, varchar … 等数据类型的设计、源码实现及在内存中计算原理有比较深的理解。

本篇基于 PostgreSQL 源码,解析 PostgreSQL 中 Numeric 类型的内存计算结构和磁盘存储结构。

c 源码 :https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/numeric.c

头文件:https://github.com/postgres/postgres/blob/master/src/include/utils/numeric.h

| 精度的要求

在编程的过程中,大家可能对内置的 4 字节 float 和 8 字节 doulbe 类型比较熟悉,进行加减乘除运算。虽然浮点数是通过科学计数法来存储,但在二进制和十进制互相转换机制中,对一部分二进制数,其精度是有缺失的。

对于类似金融场景,动辄存储巨大的数值,以及对数据精度的高要求,哪怕再小的精度损失都是不可接受的。市面上各式各样的数据库基本都包含 Numeric 类型,通过字符串来精确存储每一位数,做到浮点数都做不到的精确计算。

| Numeric 语法简介

NUMERIC(precision, scale)

  • precision:numeric 中全部数字个数的总和
  • scale:小数点后面的数字个数

例如:12.345,那么 precision 是 5、scale 是 3。

注意事项:

  1. 所有的整数都可以看成 scale 为 0 的 numeric;
  2. precision 必须为正数,scale 可以为 0 或者正数;
  3. numeric(precision) 语法,默认的 scale 是 0;
  4. 语法中不带任何参数,则任意 precision 和 scale 的值都可以被存储,只要不超过 precision 的最大值;
  5. 只要 numeric 中声明了 scale,则输入的值都要强制的去匹配这个 scale(即进行 round 操作,round 为四舍五入);
  6. 如果输入的 scale 数值溢出,则报错。

不指定精度的情况时各数值类型的取值范围【常见】:

file

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值