2017-08-17 32 views
1

我想在PostgreSQL的截断数字用:删除尾随零的TRUNC()函数返回

SELECT trunc(31.71429,15); 

我有这样的输出:

31.714290000000000 

但在甲骨文我有这样的:

31.71429 

怎么能有和Oracle一样的输出?

+0

这确实是数据表示的问题,而不是数据值。并且各种客户可以用各种方式表示它(带或不带尾随零) – Abelisto

+0

[那么你有你的答案吗?](http://meta.stackexchange.com/a/5235/169168) –

+0

是唯一的方法是投入双精度..但我仍然不知道什么样的信息会丢失,因为现在它对待简单的数据 – Kamfasage

回答

0

作为每w3resource- http://www.w3resource.com/PostgreSQL/trunc-function.php

PostgreSQL的TRUNC()函数是用来截断号码到 特定小数位。如果没有提供小数位数,则向0(0)截取 。

实施例1:的PostgreSQL TRUNC()函数

SELECT TRUNC(123.4562)AS “截断”;
输出: 截断
“---------
(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行)

所以,逗号后的第二值是值小数点后显示。

+0

我认为你错过了问题的重点。如果没有链接到源代码,你不应该粘贴显然不是你自己的图片 - 或者如果图片不是免费的,或者你没有拥有必要的权利,则不应该粘贴图片。 –

+0

@ Erwin:根据建议编辑我的答案。 – user3152549

+0

好,主要问题已修复。我仍然认为这个问题是要求别的,而不是你回答的问题。 'trunc()'的基本功能是清楚的,在结果的'numeric'值的显示中跟踪'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) 
+0

是的,我这个解决方案的韧性,但你所说的问题是。 – Kamfasage

+0

是的,我这个解决方案的韧性,但你说的问题是,失去了精度。例如: 'SELECT trunc(31.714291256987656666231,15):: double precision;' 输出: '31 .7142912569877' – Kamfasage

+0

双精度约十五位数字 - 如果它不够,那么你不能使用它。 –

1

是正确的,你的“问题”与显示 - 文本表示。因此请使用to_char()将数字格式化为您喜欢的格式。您可以使用display modifier FM打压微不足道“0”:

SELECT to_char(trunc(31.71429,15), 'FM9999999999.999999999999999') 

生成所需的结果 - 作为text显示(逗号后的10位数字前,15 - 增加更多,如果可以有更多):

'31.71429' 

顺便说一下,the manual是有点误导。它说:

前缀填充模式(抑制前导零和填充空白)

但 'FM' 也抑制微不足道尾随零。 I filed a documentation bug report.

+0

感谢您的回答,我会尝试这 – Kamfasage

+0

它的工作原理,但问题是,我做了数值的“SUM”,所以它不起作用 – Kamfasage

+0

@Kamfasage:总和之前'to_char()',它的工作原理。 'to_char(sum(trunc(...)),...)'。通常情况下,你也可以在截断之前总结,以免失去更多的精度,因此:'to_char(trunc(sum(...),...))''。 –