以十进制形式选择浮点数

时间:2013-09-18 10:05:11

标签: postgresql floating-point psql to-char

我在PostgreSQL表中有一个小数字:

test=# CREATE TABLE test (r real);
CREATE TABLE
test=# INSERT INTO test VALUES (0.00000000000000000000000000000000000000000009);
INSERT 0 1

当我运行以下查询时,它会将数字返回为8.96831e-44

test=# SELECT * FROM test;
      r      
-------------
 8.96831e-44
(1 row)

如何以小数形式(psql)显示0.00000000000000000000000000000000000000000009中的值而不是科学记数法?我对0.0000000000000000000000000000000000000000000896831感到满意。不幸的是我无法改变表格而且我并不关心精度的损失。

(我和to_char玩了一段时间没有成功。)

1 个答案:

答案 0 :(得分:2)

Real in Postgres是一个浮点数据类型,存储在4个字节,即32位。

你的价值,

0.00000000000000000000000000000000000000000009

无法在32位IEEE754浮点数中精确表示。您可以查看确切的值in this calculator

根据计算器,您尝试并使用双精度(64位)来存储它,这似乎是一个精确的表示。 NOT TRUE < / strong> Patricia表明它只是计算器四舍五入的值,即使明确要求它不要...... Double意味着更高的精度,但仍然没有确切的值,因为这个数字不能用有限数量的二进制来表示数字。 (谢谢,Patricia,一个经验教训(再次):不要相信你在Intertubez上看到的内容)

在正常情况下,您应该使用NUMERIC(精度,比例)格式,该格式会精确地存储数字以获取正确的值。

然而,您存储的值似乎比postgres允许(对于精确的十进制表示)更大。如果你不想做计算,只需存储它们(这不是一个非常常见的情况,我承认),你可以尝试将它们存储为字符串......(但这很难看......)

修改

此to_char问题似乎是 known bug ...

引用:

  

我对此的立即反应是,float8值没有57位数   精度如果您希望该格式字符串可以执行某些操作   有用的你应该将它应用于数字列而不是double   精确的。

     

我们可以通过各种方式来解决这个问题   就像你期待的那样,但总会有类似的东西   由于精度不存在而无法工作的情况。

     

快速查看代码,你得到的原因是&#34; 0。&#34;就是这样   在15位数后四舍五入以确保它不会打印垃圾。也许   对于价值非常小的情况,它可能会更聪明一些   超过1,但这不会是一个简单的改变。

from here

然而,我发现这不可辩解。如果值适合类型,恕我直言(准确的IEEE754 64位浮点数)将始终具有~15 有效十进制数字 ...

推荐阅读: