Postgres 大数值运算

Postgres large numeric value operations

我正在尝试对大数字字段(例如 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

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

select (2^89::numeric)

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