2016-11-17 5 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? 

И второй вопрос, для Джанго 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) использует функцию 'django.db.backends.utils.format_number' с определением' format_number (value, max_digits, decimal_places) ', но возвращает строку, так как я THINK (не факт, мнение. Если вы посмотрите, сообщите мне), что десятичная дробь хранится в виде строки в базе данных. – makaveli

+0

Фактически в моем db-MySQL десятичные знаки сохраняются как DECIMAL (10, 3). Так что не строка здесь, по крайней мере .. Во всяком случае, я все еще смотрю, как настроить десятичный объект decimal_places. Если есть способ, конечно, – user3599803

Смежные вопросы