我试图用以下内容截断PostgreSQL中的数字:
SELECT trunc(31.71429,15);
我有这个输出:
31.714290000000000
但是在Oracle中我有这个:
31.71429
如何获得与Oracle相同的输出?
答案 0 :(得分:1)
这是数字数据类型的行为。最简单的解决方案 - 可能会丢失一些小的精度,可以达到双精度:
postgres=# SELECT trunc(31.71429,15);
┌────────────────────┐
│ trunc │
╞════════════════════╡
│ 31.714290000000000 │
└────────────────────┘
(1 row)
postgres=# SELECT trunc(31.71429,15)::double precision;
┌──────────┐
│ trunc │
╞══════════╡
│ 31.71429 │
└──────────┘
(1 row)
答案 1 :(得分:1)
值是正确的,您的“问题”是 display - 文本表示。因此,请使用to_char()
根据自己的喜好设置数字格式。您可以使用display modifier FM
来抑制无关紧要的'0':
SELECT to_char(trunc(31.71429,15), 'FM9999999999.999999999999999')
产生所需的结果 - 显示text
(逗号之前最多10位,逗号之后最多15位) - 如果可以更多则添加更多数字:
'31.71429'
BTW,the manual对此有点误导。它说:
前缀填充模式(抑制前导零和填充空白)
但'FM'也会抑制无效的尾随零。 I filed a documentation bug report.
答案 2 :(得分:1)
如其他thread所述,您现在可以使用从PostgreSQL 13开始的新trim_scale(numeric)
函数。
例如trim_scale(8.4100)→8.41
答案 3 :(得分:0)
根据w3resource - http://www.w3resource.com/PostgreSQL/trunc-function.php
PostgreSQL trunc()函数用于将数字截断为a 特定小数位。如果没有提供小数位 截断为零(0)。
示例1:PostgreSQL TRUNC()函数
SELECT TRUNC(123.4562)AS“Truncate”;
输出: 截断
“---------
123
(1排)
示例2:PostgreSQL TRUNC()函数
SELECT TRUNC(67.4562,1)AS“截断最多1位小数”;
输出: 截断
“---------
123.4
(1排)
示例3:PostgreSQL TRUNC()函数
SELECT TRUNC(67.4562,2)AS“截断最多2位小数”;
输出: 截断
“---------
123.45
(1排)
因此,逗号后面的第二个值是小数点后显示的值。