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 如何求幂,我缺少什么?或者,它是否被转换为浮点数并返回,并且我看到舍入/截断错误?
是的,它正在转换为双精度,因此您会看到这些舍入错误:
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)
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |