# 精确数值类型-Decimal 类型

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

```sql
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 个字节  |
