Skip to content

精确数值类型-Decimal 类型

Decimal 数据类型用来存储精确的数值。精确数值类型在需要用到非常准确的数值精度的场景下使用,比如银行账户数字,或者严谨的科学计算等。 在 Decimal 的列名声明中,整数和小数部分一般都会进行声明。比如以下例子:

salary DECIMAL(5,2)

在这个案例中,5 是有效数字位数,2 是小数位。整数精度表示数值部分存储的有效位数,小数精度表示小数部分存储的有效位数。 标准 SQL 要求 DECIMAL(5,2) 需要存储 5 位数字,2 位小数,因此如果以该形式表示的工资列数字取值范围应该在 -999.99 到 999.99 之间。 在 MatrixOne 的语法中,DECIMAL(M) 与 DECIMAL(M,0) 是相同的。如果直接只声明 DECIMAL 的话,语法也将解析成 DECIMAL(M,0) 的形式,M 的默认值为 10。 如果小数精度为 0 的话,DECIMAL 相当于纯整数,不含任何小数。 MatrixOne 中 DECIMAL 类型的最大位数为 38 位。另外 DECIMAL 中指定的整数或小数位数在实际列被赋值的时候超出指定范围,实际数值将会被自动转换成相应精度。

Decimal 数据类型特点

该部分内容主要介绍 Decimal 数据类型的一些特点,尤其是在位数精度和存储形式上的。

DECIMAL 列的声明语法是 DECIMAL(M, D). M 是有效数字的位数,取值范围是 1 到 38,D 是小数位数,取值范围是 1 到 38,但是不能大于 M。 如果不指定 D,默认为 0。如果不指定 M,默认为 10。

DECIMAL 列的数值以二进制的形式进行存储,在 MatrixOne 内部,只有 decimal64 和 decimal128 这两种表示形式。在 0-18 位精度内,一个 Decimal 数值占用 8 个字节的存储空间,在 19-38 位精度内,一个 Decimal 数值占用 16 个字节的存储空间。

位数 字节数
0-18 8 个字节
19-38 16 个字节

对于详细的 Decimal 类型实现方法,可以参考 Decimal 的设计文档