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