postgresql bigint 太大?

use*_*098 3 postgresql exponential

跑步

x86_64-pc-linux-gnu 上的 PostgreSQL 11.4 (Debian 11.4-1.pgdg90+1),由 gcc 编译 (Debian 6.3.0-18+deb9u1) 6.3.0 20170516,64 位

我尝试过这个声明:

SELECT CAST (2^63-1 as bigint);
Run Code Online (Sandbox Code Playgroud)

但收到意外的错误消息:

bigint 超出范围

奇怪的是,如果我只是用其等效的整数替换指数形式:

SELECT CAST (9223372036854775807 as bigint)
Run Code Online (Sandbox Code Playgroud)

它按预期工作。我想这只是我没有正确理解事情。FWIW我可以使用的指数表示法中的最大数字是这样的:

SELECT CAST (2^63-513 as bigint);
Run Code Online (Sandbox Code Playgroud)

任何更大的东西都会以同样的方式出错。

关于 PostgreSQL 如何求幂,我缺少什么?或者,它是否被转换为浮点数并返回,并且我看到舍入/截断错误?

Jer*_*emy 5

是的,它正在转换为双精度,因此您会看到这些舍入错误:

select pg_typeof(2^63);
    pg_typeof
------------------
 double precision

select pg_typeof(2^63-1);
    pg_typeof
------------------
 double precision

Run Code Online (Sandbox Code Playgroud)

如果您以数字开头,它会起作用:


select (2::numeric^63-1)::bigint;
        int8
---------------------
 9223372036854775807

Run Code Online (Sandbox Code Playgroud)