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 将 2
和 89
作为类型 integer
。在那种情况下,结果也是类型 integer
,这不是该大小的精确值。您的演员表是对那个不准确结果的演员表,因此无法正常工作。
我正在尝试对大数字字段(例如 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 将 2
和 89
作为类型 integer
。在那种情况下,结果也是类型 integer
,这不是该大小的精确值。您的演员表是对那个不准确结果的演员表,因此无法正常工作。