Postgres операции с большими числовыми значениями - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь выполнить некоторые операции с большим числовым полем, например 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

1 Ответ

3 голосов
/ 01 октября 2019

Вы не должны приводить результат, но одну часть операции, чтобы дать понять, что это операция numeric, а не операция integer:

select (2^89::numeric)

В противном случае PostgreSQL принимает 2и 89 как тип integer. В этом случае результатом также будет тип integer, который не является точным значением при этом размере. Ваш актерский состав - это результат этого неточного результата, поэтому он не может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...