Postgresql Postgres大数值运算

Postgresql Postgres大数值运算,postgresql,numeric,Postgresql,Numeric,我正在尝试对大型数值字段(如2^89)执行一些操作 Postgres数字数据类型可以在小数点左边存储131072位,在小数点右边存储16383位 我试过这样的方法,效果很好: select 0.037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037037::numeric; 但当我使用一些运算符时,它会舍入14位之后的值 select (2^89)::num

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

您不应强制转换结果,而应强制转换操作的一部分,以明确这是一个
数值
操作,而不是
整数
操作:

select (2^89::numeric)

否则,PostgreSQL将
2
89
作为类型
integer
。在这种情况下,结果也是type
integer
,它不是该大小的精确值。您的强制转换是对不准确结果的强制转换,因此无法工作。

您不应强制转换结果,而应强制转换操作的一部分,以明确这是一个
数值操作,而不是
整数操作:

select (2^89::numeric)

否则,PostgreSQL将
2
89
作为类型
integer
。在这种情况下,结果也是type
integer
,它不是该大小的精确值。你的施法结果不准确,因此无法使用。

完美。解决我的问题。非常感谢,太好了。解决我的问题。谢谢。