pg中的数字类型总结

pg中的数字类型如下表:

名字存储尺寸描述范围
smallint2字节小范围整数-32768 to +32767
integer4字节整数的典型选择-2147483648 to +2147483647
bigint8字节大范围整数-9223372036854775808 to +9223372036854775807
decimal可变用户指定精度,精确最高小数点前131072位,以及小数点后16383位
numeric可变用户指定精度,精确最高小数点前131072位,以及小数点后16383位
real4字节可变精度,不精确6位十进制精度
double precision8字节可变精度,不精确15位十进制精度
smallserial2字节自动增加的小整数1到32767
serial4字节自动增加的整数1到2147483647
bigserial8字节自动增长的大整数1到9223372036854775807

如果需要以极高的精度处理数据,或者以精确的精度存储数据,那么就使用numeric类型,它没有范围限制和精确的存储,代价是存储大小和处理速度,numeric类型上的算术运算比整数类型或者浮点数类型要慢很多。

对于定长的数字类型,类型越小,数据在磁盘和内存中占用的空间越小,同时,类型越小,可以存储的值范围越窄。而对于整数类型,较小的类型意味着较小的范围。

对于浮点类型,较小的类型表示精度较低。

”神奇“的四舍五入:

test=# SELECT 3.0::float8 * (1.0/5.0);
      ?column?      
--------------------
 0.6000000000000001
(1 row)
test=# SELECT 3.0::float8 * (1.0/5.0) <= 0.6;
 ?column? 
----------
 f
(1 row)

当系统处理货币时,对计算中的小偏差和适当舍入表示无法接受。精确的数学得出精确的结果。


test=# SELECT 3.0::numeric * (1.0/5.0);
        ?column?         
-------------------------
 0.600000000000000000000
(1 row)

所以官方文档也标明,进行精度要求高的计算时使用numeric类型。

这是因为numeric类型的舍入行为“远离零”,而double percision和float的舍入行为是“接近最近的偶数值”。

test=# SELECT x,                                                                
test-#   round(x::numeric) AS num_round,
test-#   round(x::double precision) AS dbl_round
test-# FROM generate_series(-3.5, 3.5, 1) as x;
  x   | num_round | dbl_round 
------+-----------+-----------
 -3.5 |        -4 |        -4
 -2.5 |        -3 |        -2
 -1.5 |        -2 |        -2
 -0.5 |        -1 |        -0
  0.5 |         1 |         0
  1.5 |         2 |         2
  2.5 |         3 |         2
  3.5 |         4 |         4
(8 rows)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值