在Django中,可以从DecimalField的Avg获取Decimal吗?
在使用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
对我来说已经足够用了。不过,这确实是一个很好的研究方向。