在Django中,可以从DecimalField的Avg获取Decimal吗?

3 投票
1 回答
635 浏览
提问于 2025-04-17 12:05

在使用Avg这个聚合函数来计算models.DecimalField时,返回的结果是一个float类型,而不是decimal.Decimal类型。这是因为我用的数据库(在这个例子中是sqlite3)不支持将聚合值作为小数返回吗?如果是这样的话,有没有其他数据库可以做到这一点?有没有什么办法可以让结果以小数的形式返回,这样就可以进行准确的小数计算(而且不需要把float转成str再转回decimal.Decimal)?

注意:我并不是想和那些认为“足够准确”和“准确”是一样的人争论,也不是想引发关于星际飞船企业号因为错误的浮点运算而坠毁的讨论。

1 个回答

1

根据SQLLite 3手册,支持的数据类型有 null(空值)、integer(整数)、real(实际上就是 float,浮点数)、text(文本)和 blob(二进制大对象)。根据这些信息,我会期待这个数据库引擎会把任何输入的 decimal.Decimal 类型转换成 real,然后再以 float 的形式返回给你,因为它不想把数据转换得太精确。

大多数实际使用的数据库(我觉得SQLite不太适合用作正式项目,更多是用来做原型)都支持小数数据类型。我知道MySQL是支持的。至于它们是否返回 decimal.Decimal 而不是 float,我就不太清楚了,因为我没有深入研究它们的精度,float 对我来说已经足够用了。不过,这确实是一个很好的研究方向。

撰写回答