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 Simon Hanna, 7 years ago

Summary: Sum aggregation might return "-0.00" instead of NoneSum aggregation might return "-0.00" instead of "0.00"

comment:2 by Simon Hanna, 7 years ago

I'm using a sqlite database.

comment:3 by Tim Graham, 7 years ago

Did you try execute a raw SQL query? It might SQLite at fault rather than Django.

comment:4 by Daniel Marohn, 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 Tim Graham, 7 years ago

Resolution: needsinfo
Status: newclosed
Note: See TracTickets for help on using tickets.
Back to Top