问题描述
Django 2.2,PostgreSQL 数据库。我有一个带有 Line
属性的 positions
对象。这是 ArrayField
的 DecimalField
,其中 max_digits
为 12,decimal_places
为 3。
我将一些浮点数存储为 Decimal
并将它们从数据库中取出:
pos = [6586.87849502,2.04190477e-01,7.14666669e-01]
line = Line(positions=pos)
line.save()
line.refresh_from_db() # send it through Django's ORM piping
print(line.positions)
输出:
[十进制('6586.879')、十进制('0.204')、十进制('0.715')]
有趣的是,尽管下一个更有效的数字低于 5,但第一个位置被四舍五入。另一个浮动按预期四舍五入。
我以为可能是 PostgreSQL 搞砸了,但不是:
INSERT INTO line(positions) VALUES (array[6586.87849502,7.14666669e-01]) RETURNING positions;
位置(数字[]) {6586.878,0.204,0.715}
真正的问题是我试图预测数据库中会出现什么,精确到小数点后三位:
[Decimal(x).quantize(Decimal("0.001")) for x in pos]
可能会产生
[十进制('6586.878')、十进制('0.204')、十进制('0.715')]
或
[十进制('6586.879')、十进制('0.205')、十进制('0.714')]
根据 decimal.ROUND_*
标志,我传入 quantize()
,但我从未在整个数组中获得一致的舍入。在插入数字之前,Django 对我的数字做了什么样的预处理?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)