Python的浮点数;浮动;和PostgreSQL“;“双精度”;
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中的一些(可能有趣的)附加信息: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标准
>>> 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