首页 > 解决方案 > Postgres 大数值运算

问题描述

我正在尝试对大型数字字段(例如 2^89)进行一些操作。

Postgres 数字数据类型可以在小数点左侧存储 131072,在小数点右侧存储 16383 位。

我尝试了这样的事情并且它奏效了:

select 0.037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037::numeric;

但是当我放置一些运算符时,它会在 14 位数字后四舍五入。

select (2^89)::numeric(40,0);

           numeric              
-----------------------------   
 618970019642690000000000000    
(1 row)  

我知道其他地方的价值是:

>>> 2**89
618970019642690137449562112

为什么会出现这种奇怪的行为。它不允许我将超过 14 位数字的值输入到数据库中。

insert into x select (2^89-1)::numeric;

 select * from x;        
              x                 
-----------------------------   
 618970019642690000000000000    
(1 row)     

有什么办法可以规避这一点。

提前致谢。

bb23850

标签: postgresqlnumeric

解决方案


您不应该转换结果,而是转换操作的一部分,以明确这是一个numeric操作,而不是一个integer操作:

select (2^89::numeric)

否则 PostgreSQL 采用289作为类型integer。在这种情况下,结果也是 type integer,它不是那个大小的精确值。您的演员表是该不准确结果的演员表,因此无法正常工作。


推荐阅读