Python Django和DecimalField

时间:2018-08-24 09:34:49

标签: python django math django-rest-framework decimal

在我的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 |
+-------+----------------------------------+----------------------+

“余额”列类型为“双”。

如果我在模型或django rest框架序列化程序中使用FloatFiled,则会从​​表中获取原始值。为了赚钱,建议使用DecimalField(Python的Decimal)

例如:

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

MySQL表中的1.1102230246251565e-16变为0.00000000000000011102230246251565000。 不错,但是如果表中的余额值= 263.74645817644887,经过处理等后,我将有263.74645817644887000000000000000000000。如果余额= 0,我将有0.00000000000000000000000000000000000000000。

在数学中,当然263.74645817644887和263.74645817644887000000000000000000000相同,并且0等于0.00000000000000000000000000000000000000000。

如果小数点后的值超过35位怎么办?

但是我想问一个问题:在这种情况下,我使用这样的值做对了吗?我的疑问是,如果PHP或Perl中的第三方脚本将对我的新值(Python的Decimal)执行加/减等操作,那么精度会有问题吗?

还是使用固定精度的FloatField?因为如果在将数据作为Float插入之前(在Perl或PHP中,而不是在Python中),则最好继续使用FLOAT?。但是我找不到如何在Django或Django Rest Framework序列化程序中为FloadField设置精度

在纯Python中,我可以这样做:

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

在Django或DRF中如何实现?

如果我使用FloatField,则会得到 5.0912399296443305e-14 ,而不是 0.000000000000050912399296443305 ,如表中所示。

P.S。请注意,值(十进制和浮点数)已经存在差异:

0.00000000000000011102230246251565000
0.00000000000000011102230246251565404

0 个答案:

没有答案