您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

NUMERIC 和 DECIMAL

NUMERICDECIMAL 数据类型的格式随精度的变化而变化。

必须用零填充值的右侧,以达到值的全部位数。还必须用零完全填充值的左侧,但填充随二进制编程自动进行。填充值后,将删除小数点。例如,12.34 如下所示:

  • NUMERIC(4,2):1234

  • NUMERIC(6,4):123400

  • NUMERIC(8,4):00123400

  • NUMERIC(12,6):000012340000

  • NUMERIC(16,8):0000001234000000

    填充值并删除小数点后,以下规则适用:

  • 如果精度 <= 4,则二进制格式与 2 字节整数数量的本机操作系统二进制格式相同。

  • 如果精度在 5 和 9 之间,则二进制格式与 4 字节整数数量的本机操作系统二进制格式相同。

  • 如果精度在 10 和 18 之间,则二进制格式与 8 字节整数数量的本机操作系统二进制格式相同。

  • 如果精度 >= 19,则有一个使用以下 C++ 结构定义的特殊格式:struct {unsigned char sign; // sign 1 for +, 0 for -unsigned char ndig; // # digitsunsigned char exp; // exponentunsigned char erracc; // should be 0unsigned short digits[80];};指数是 excess-80 格式,除非值为零。“零”值表示为:sign = 1ndig = 0erracc = 0exp = 0最大指数值为 159。支持的最大位数为 288。"digits[0]" 包含重要性最低的数字。以打包表示形式存储的数字每个“无符号短整型”(2 字节)数量有 2 个数字。对于给定的“数字”: lower order digit = digit[i] & 0x00FFhigh order digit = digit[i] & 0xFF00例如,考虑以 NUMERIC(20) 表示的值 100。该值的二进制布局为:0x0101 0x5000 0x0064 0x0000 0x0000 ...... Sign = 0x01Number digits = 0x01Exponent = 0x50Erracc = 0x00Digits = 0x0064再例如,考虑值 32769:0x0102 0x5000 0x0ad1 0x0003 0x0000 0x0000 .... Sign = 0x01Number digits = 0x02Exponent = 0x50Erracc = 0x00Digits = 0x0ad1 0x0003如果将数字转换成基数 10,则有:0x0ad1 = 2769 0x0003 = 3

  • lower order digit = digit[i] & 0x00FF

  • high order digit = digit[i] & 0xFF00