views:

121

answers:

2

If 5 and 5.00 and 5.000 are all different, then why does Django's decimal field save without the .00 even when I have decimal_places=2

?

More importantly, how can I save a value 5.00 as 5.00 in Django without using String.

+3  A: 

I think it would be more correct to say those are different representations of the same value '5'.

Internally, the value saved (unless you're actually storing a string) is 5.

When the value is displayed, ie converted to a string representation for the screen, it might be shown as 5, 5.00 or 5.000 but internally, it's still 5

The two decimal places do not appear (if I can put it that way) until the value is output.

You can't save a number with 2 decimal places unless you use a string.

pavium
You could also save "100 × value" as an int
Roberto Bonvallet
+1  A: 

You have an argument that Django ought to enforce a certain precision on its Python objects, but decimal_places is probably more about maximum precision. I believe precision is not stored in the database, so it will be lost in any case.

In any case, if you want to enforce precision, use something like: Decimal(5).quantize(Decimal(10)**-DECIMAL_PLACES)

You can overload the to_python method in a custom django.db.models.DecimalField to ensure that a python Decimal object with the correct precision is returned.

Will Hardy