В моей базе данных 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