Python的浮点数;浮动;和PostgreSQL“;“双精度”;

Python的浮点数;浮动;和PostgreSQL“;“双精度”;,python,django,postgresql,floating-point,Python,Django,Postgresql,Floating Point,Python的“float”类型和PostgreSQL的“double precision”类型基于相同的C实现吗?这可能不是真正的根本问题,但无论如何,当我尝试在两种环境中处理小数字时,我得到了以下结果: 在Python上(2.7.2 GCC 4.2.1,如果相关的话): 关于PostgreSQL(9.1.1): 据我所知,Python浮点类型“处理”1e-310,而PostgreSQL双精度类型不处理。 “float”和“double-precision”类型上的和都是指IEEE 754标准

Python的“float”类型和PostgreSQL的“double precision”类型基于相同的C实现吗?这可能不是真正的根本问题,但无论如何,当我尝试在两种环境中处理小数字时,我得到了以下结果:

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

关于PostgreSQL(9.1.1):

据我所知,Python浮点类型“处理”1e-310,而PostgreSQL双精度类型不处理。 “float”和“double-precision”类型上的和都是指IEEE 754标准,该标准应该在“大多数平台”(我在OS X Lion 10.7.3上)上实现

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

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
我真的没有得到第二个值。

浮点值('1e-310')超出53位浮点(+308到-308)的通常指数范围,因此它的存储精度较低,以实现逐渐下溢

PostgreSQL似乎在非规范化方面存在一些未解决的问题:

对于接近零的值,考虑在DB:

中存储之前对它们进行舍入。
>>> round(float('1e-302'), 308)
1e-302
>>> round(float('1e-310'), 308)
0.0

我猜测Postgres拒绝给你,因为.1不能用二进制(尾数)精确表示。@b我不确定我是否理解。“选择1e-100::双精度”在Postgres中效果良好;我认为这不是一个精确的问题,而是一个精确的问题!冷却无人地带。然而,还有一个更窄的区域,您的解决方案不起作用:例如,round(float('1e-308'),308)给出的1e-308不被postgres接受。我只是选择这样做:如果abs(ff)>>> 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
>>> round(float('1e-302'), 308)
1e-302
>>> round(float('1e-310'), 308)
0.0