Opened 7 years ago
Closed 7 years ago
#28797 closed Bug (needsinfo)
Sum aggregation might return "-0.00" instead of "0.00"
Reported by: | Simon Hanna | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.11 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I have an application with the following Model:
class Split(models.Model): amount = models.DecimalField(max_digits=10, decimal_places=2)
And perform the following query:
Split.objects.filter(...).aggregate(models.Sum('amount'))['amount__sum'] or 0
which returns the mentioned "-0.00" for specific filters. I'm not sure why that happens.
A values_list for an example where it happens is here:
[29.63, -30.0, 155.5, -156.45, -0.08, 400.0, -400.0, 440.0, -463.98, -10.0, -700.0, 735.0, -14.83, -150.0, 0.08, -9.5, -2.34, -62.82, -500.0, 735.0, -300.0, -500.0, 490.0, -170.6, -10.0, -300.0, -0.11, 735.0, 300.0, -239.5]
The whole code is part of https://github.com/agstrike/silverstrike with the query in https://github.com/agstrike/silverstrike/blob/master/silverstrike/models.py#L54
If you point me at the right direction I might be able to debug a little
Change History (5)
comment:1 by , 7 years ago
Summary: | Sum aggregation might return "-0.00" instead of None → Sum aggregation might return "-0.00" instead of "0.00" |
---|
comment:2 by , 7 years ago
comment:3 by , 7 years ago
Did you try execute a raw SQL query? It might SQLite at fault rather than Django.
comment:4 by , 7 years ago
I cannot reproduce this. I wrote following test in tests/aggregation and it passed. Can you check, if it also pass on your machine?
Code highlighting:
def test_sum_to_zero(self): for price in [29.63, -30.0, 155.5, -156.45, -0.08, 400.0, -400.0, 440.0, -463.98, -10.0, -700.0, 735.0, -14.83, -150.0, 0.08, -9.5, -2.34, -62.82, -500.0, 735.0, -300.0, -500.0, 490.0, -170.6, -10.0, -300.0, -0.11, 735.0, 300.0, -239.5]: Book.objects.create( isbn='1', name='sum_zero', pages=1, rating=4.0, price=price, contact=self.a8, publisher=self.p3, pubdate=datetime.date(1995, 1, 15)) price = Book.objects.filter(name='sum_zero').aggregate(Sum('price'))['price__sum'] self.assertEqual(0.0, price)
comment:5 by , 7 years ago
Resolution: | → needsinfo |
---|---|
Status: | new → closed |
I'm using a sqlite database.