2016-11-17 140 views
1

为什么我在这里得到错误的精度?我已经在浮点后询问了3个十进制数字。python十进制精度和django DecimalField

>>> from decimal import Decimal 
>>> from decimal import getcontext 

>>> getcontext().prec = 3 
>>> Decimal(1.111) + Decimal(2.222) 
Decimal('3.33') # Why not 3.333? 

而第二个问题,Django的DecimalField,我定义我的领域是这样的:

value = models.DecimalField(max_digits=10, decimal_places=3) 

做它赋予了相同的结果设置

getcontext().prec = 3 

十进制?

回答

4
  1. prec设置作为max_digits设置,因此,如果您尝试小数加200.222和300.333在一起,你会看到这个问题的时候了。要得到正好3个小数位,您可以使用round()函数,如round(Decimal(123.3334343), 3)

  2. 这个问题的第一部分实际上是回答,而只是澄清:
    max_digits套多少位可以前后都有逗号后总有。
    decimal_places指定存储多少个小数位。
    因此简短的回答是:getcontext().prec = 3!= decimal_places=3

+0

所以max_digits就像getcontext()。prec?如果是这样,我怎样才能控制小数位(逗号后的数字位数),以及小数点模块?即什么django确保decimal_places? – user3599803

+0

@ user3599803我检查了源代码,Django(1.9)使用'format_number(value,max_digits,decimal_places)'定义了'django.db.backends.utils.format_number'函数,但是返回一个字符串,因为我THINK不是一个事实,一个观点,如果你查看它,让我知道)小数点存储为数据库中的一个字符串。 – makaveli

+0

实际上,在我的db-MySQL中,小数存储为DECIMAL(10,3)数据类型。所以至少在这里不是一个字符串..无论如何,我仍然看看如何配置Decimal对象decimal_places。如果有方法 – user3599803