Python Django и DecimalField - PullRequest
       16

Python Django и DecimalField

0 голосов
/ 24 августа 2018

В моей базе данных MySQL у меня есть такие значения:

+-------+----------------------------------+----------------------+
| id    | balance                          | max(length(balance)) |
+-------+----------------------------------+----------------------+
| 39081 |           1.1102230246251565e-16 |                   22 |
| 41565 |  0.00000000000002930988785010413 |                   31 |
| 37692 |   0.0000000000000315303338993544 |                   30 |
| 39409 |  0.00000000000004263256414560601 |                   31 |
| 37498 |    0.000000000000049737991503207 |                   29 |
| 39943 | 0.000000000000050912399296443305 |                   32 |
| 35856 |    0.000000000000116351372980716 |                   29 |
| 41163 |   0.0000000000004618527782440651 |                   30 |
| 44612 |   0.0000000000006898925875020723 |                   30 |
| 40211 |   0.0000000000009268141809570807 |                   30 |
+-------+----------------------------------+----------------------+

Тип столбца «баланс» - «двойной».

Если я использую FloatFiled в моей модели или в сериализаторах rest Framework django.Я получаю оригинальные значения из таблицы.За деньги рекомендуем использовать DecimalField (Python's Decimal)

Например:

balance = serializers.DecimalField(decimal_places=35, max_digits=40, default=0)

, а 1.1102230246251565e-16 из таблицы MySQL становится 0,00000000000000011102230246251565000.Не плохо, но если значение баланса из таблицы = 263.74645817644887 у меня будет 263.74645817644887000000000000000000000 после обработки и т.д. И если баланс = 0 у меня будет 0.00000000000000000000000000000000000.

1012 * В математике конечно +263,74645817644887 и 263,74645817644887000000000000000000000 такие же, как и 0 равны0,00000000000000000000000000000000000.

А что делать, если значение имеет более 35 цифр после десятичной точки?

Но я хочу задать вопрос: я делаю все правильно в этом случае с такими значениями?Я сомневаюсь, что если сторонний скрипт на PHP или Perl будет выполнять операции сложения / вычитания и т. Д. С моими новыми значениями (десятичное значение Python), могут ли быть проблемы с точностью?

Или использовать FloatField с фиксированной точностью?Потому что если до того, как данные были вставлены как Float (в Perl или PHP, а не в Python), лучше продолжать использовать FLOAT ?.Но я не смог найти, как установить точность FloadField в сериализаторах Django или Django Rest Framework

В чистом Python я могу сделать:

>>> f'{1.1102230246251565e-16:.35f}'
'0.00000000000000011102230246251565404'

Как это сделать в Django илиDRF?

Если я использую FloatField, я получаю 5.0912399296443305e-14 вместо 0.000000000000050912399296443305 , как в таблице.

PS уведомление уже есть разница взначения (десятичные и плавающие):

0.00000000000000011102230246251565000
0.00000000000000011102230246251565404
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...