Django DecimalField 不一致的舍入

问题描述

Django 2.2,PostgreSQL 数据库。我有一个带有 Line 属性的 positions 对象。这是 ArrayFieldDecimalField,其中 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...