我在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
玩了一段时间没有成功。)
答案 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,但这不会是一个简单的改变。
然而,我发现这不可辩解。如果值适合类型,恕我直言(准确的IEEE754 64位浮点数)将始终具有~15 有效十进制数字 ...