python - Python "float"和 PostgreSQL "double precision"的 float

标签 python django postgresql floating-point

Python 的“浮点”类型和 PostgreSQL 的“ double ”类型是否基于相同的 C 实现?这可能不是这里真正的潜在问题,但无论如何,这是我在两种环境中尝试操纵小数字时得到的结果:

在 Python 上(2.7.2 GCC 4.2.1,如果相关的话):

>>> float('1e-310')
1e-310

在 PostgreSQL (9.1.1) 上:

postgres# select 1e-310::double precision;
ERROR:  "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" is out of range for type double precision

我的理解是 Python 浮点类型“处理”1e-310 而 PostgreSQL double 类型不处理。 两者 PythonPostgreSQL分别关于“浮点”和“ double ”类型的文档指的是 IEEE 754 标准,该标准应该在“大多数平台”上实现(我在 OS X Lion 10.7.3 上)。

谁能解释一下这里发生了什么?并给我一个解决方案,例如,我想“降低”Python 精度,以便我可以通过 Django FloatField 在我的数据库中插入 float 。 (完整的用例是我从文件中读取图形然后插入它们)。

一些(可能有趣的)附加信息,用 Python 编写:

>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
>>> 1e-320.__sizeof__()
24

我真的不明白第二个。

最佳答案

值 float('1e-310') 是一个 denormal number它超出了 53 位 float 的通常指数范围(+308 到 -308),因此以较低的精度存储它以实现逐渐下溢。

PostgreSQL 似乎有一些 Unresolved 非正规问题:http://archives.postgresql.org/pgsql-hackers/2011-06/msg00885.php

对于接近零的值,考虑在存储到数据库之前对其进行舍入:

>>> round(float('1e-302'), 308)
1e-302
>>> round(float('1e-310'), 308)
0.0

关于python - Python "float"和 PostgreSQL "double precision"的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9556586/

相关文章:

python - 使用fastapi下载文件

python - Matplotlib 3d 散点动画 - 如何正确更新

django - Heroku 未从 requirements.txt 安装 psycopg2

sql - 什么时候适合使用index_scan来获取已经排序的数据?

python - 阴谋冲刺 : How to add footnotes and source text to plots

python - 将 TinyMCE 用于深色背景的网站

python - 在 Celery 3.1.11 中使用 Django 进行单元测试?

python - 使用 postman 的 GET 请求可以正常工作,但不能使用 python (HTTPSConnectionPool)

postgresql - 从另一个表复制权限

multithreading - 如何避免更新死锁