PostgreSQL 教程: double precision 数据类型

六月 9, 2024

摘要:在本教程中,您将了解 PostgreSQL double precision数据类型及其特性。

目录

PostgreSQL double precision 类型简介

在 PostgreSQL 中,double precision是一种不精确的、可变精度的数值类型。

不精确意味着 PostgreSQL 无法将某些值精确地转换为内部格式,只能将它们存储为近似值。因此,存储和查询的值可能会出现细微的差异。

如果应用程序需要精确的存储和计算,建议改用 numeric 类型。

请注意,PostgreSQL double precision 数据类型是遵循 IEEE 754 号浮点运算标准的实现。

下面展示了如何使用double precision类型定义一个列:

column_name double precision

或者,您可以使用与double precision相同的float8float数据类型:

colum_name float

double precision类型的列可以存储范围在1E-3071E+308之间的值,精度至少是 15 位数字。

如果存储的值超出了范围,PostgreSQL 将无法存储该值并引发错误。

如果您以非常高的精度存储数字,PostgreSQL 可能会将它们舍入以适应 double precision 的限制。这可能会在计算中丢失一些精度。

如果存储非常小的接近于零的数字,则由于 double precision 数据类型的限制,PostgreSQL 可能会引发下溢错误,可能无法准确表示这些小值,以让其与零值区分开来。

在实践中,您通常会使用 double precision 类型来存储科学测量值。

PostgreSQL double precision 类型示例

让我们来看一些使用double precision数据类型的例子。

1) 基本的 double precision 数据类型示例

首先,创建一个表,名为temperatures,用来存储温度读数:

CREATE TABLE temperatures (
    id SERIAL PRIMARY KEY,
    location TEXT NOT NULL,
    temperature DOUBLE PRECISION
);

第二步,向temperatures表中插入一些行:

INSERT INTO
  temperatures (location, temperature)
VALUES
  ('Lab Room 1', 23.5),
  ('Server Room 1', 21.8),
  ('Server Room 2', 24.3)
RETURNING *;

输出:

 id |   location    | temperature
----+---------------+-------------
  1 | Lab Room 1    |        23.5
  2 | Server Room 1 |        21.8
  3 | Server Room 2 |        24.3
(3 rows)

第三步,计算所有位置的平均温度:

SELECT AVG(temperature)
FROM temperatures;

输出:

 avg
------
 23.2

2) 存储不精确的数值

首先,创建一个表 t,列cdouble precision类型:

CREATE TABLE t(c double precision);

第二步,插入行t表中:

INSERT INTO t(c) VALUES(0.1), (0.1), (0.1)
RETURNING *;

输出:

  c
-----
 0.1
 0.1
 0.1
(3 rows)

第三,使用SUM()函数计算 c 列中数值的总和:

SELECT SUM(c) FROM t;

输出:

         sum
---------------------
 0.30000000000000004
(1 row)

输出表示0.10.10.1的和不是0.3,而是0.30000000000000004。这表明 PostgreSQL 不能使用double precision类型来存储确切的数字0.1

3) 插入过小的数字

下面的语句尝试将一个非常小的数字插入t表的c列中:

INSERT INTO t(c) 
VALUES (1E-400);

它返回以下错误:

ERROR:  "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" is out of range for type double precision

原因是这个数字太小,非常接近于零。由于 double precision 类型的限制,PostgreSQL 无法存储它。

总结

  • double precision数据类型表示不精确的数字。
  • double precisionfloat8float是同义词。
  • 使用double precision类型存储不精确的数字,使用numeric类型存储精确的数字。

了解更多

PostgreSQL 教程:数据类型

PostgreSQL 文档:浮点类型