2014-05-02 59 views
1

我想用一個DecimalField有6位小數不一致似乎和我在一個獨立的模型測試它:拖地的零對我DecimalField

class MyItem(models.Model): 
    myval = models.DecimalField(max_digits=18, decimal_places=6) 
    def __str__(self): 
     return str(self.myval) 

現在我使用它內置的管理員,並遵守下列規定:

  • 增加值高達4位小數按預期工作(0.0001)
  • 增加值大於1似乎確定

但是,加入像0.000010.000001值將與一個尾隨零顯示它,也就是說,0.000010

雖然在數學上是正確的(相同數量),我可以用很少的工作修剪零,我打擾,有時這個零點出現,其他時候,它沒有。我還沒有測試過很寬範圍的數字,我不確定是否真的會爲所有數字保存正確的值。

據我瞭解,DecimalField應該保持正確性。我在創建模型時缺少一些基本的東西嗎?到底是怎麼回事?

使用

版本的Python 3.3和1.6的Django

回答

1

這裏是一個要解決的問題DecimalField模型的替代時,發現here

class NonscientificDecimalField(DecimalField): 
    """ Prevents values from being displayed with E notation, with trailing 0's 
     after the decimal place truncated. (This causes precision to be lost in 
     many cases, but is more user friendly and consistent for non-scientist 
     users) 
    """ 
    def value_from_object(self, obj): 
     def remove_exponent(val): 
      """Remove exponent and trailing zeros. 
       >>> remove_exponent(Decimal('5E+3')) 
       Decimal('5000') 
      """ 
      context = decimal.Context(prec=self.max_digits) 
      return val.quantize(decimal.Decimal(1), context=context) if val == val.to_integral() else val.normalize(context) 

     val = super(NonscientificDecimalField, self).value_from_object(obj) 
     if isinstance(val, decimal.Decimal): 
      return remove_exponent(val)