精度为 10、小数位数为 2 的字段必须舍入到小于 10^8 的绝对值

Adi*_*lik 7 python django postgresql django-models postgresql-9.3

total_pricepostgres数据库中有一个 django-field版本9.3.11

这是它的当前代码。

total_value = models.DecimalField(decimal_places=100, default=0, max_digits=300)

我想将其转换为正确的小数点后两位。所以我写了这段代码

total_value = models.DecimalField(decimal_places=2, default=0, max_digits=10)

我的迁移文件

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('my_table', '0040_my_table_skipped'),
    ]

    operations = [
        migrations.AlterField(
            model_name='my_table',
            name='total_value',
            field=models.DecimalField(default=0, max_digits=10, decimal_places=2),
        ),
    ]

Run Code Online (Sandbox Code Playgroud)

当我运行命令 python manage.py migrate

它向我展示了这个错误

A field with precision 10, scale 2 must round to an absolute value less than 10^8.

知道这是关于什么吗?

bh4*_*4th 9

正如@sivakumar-r 上面提到的,这是精度和规模问题。

让我们看看它是如何Numeric(precision, scale)工作的:

假设,如果我们有一个用NUMERIC(10,3).

这意味着,我们总共只能保存 10 位数字,小数点后有 3 个空格。

所以在这种情况下你可以保存的范围是:+9999999.999 到 -9999999.999。

一种解决方案可能是:

更改表列以使用NUMERIC没有精度和小数位数的类型。

这将接受小数点前最多 131072 位数字;小数点后最多 16383 位。如 postgres:11 数字类型文档中所述


小智 3

之前您有十进制数,例如 Number(300, 100)。我认为你在这个小数字段中有一些数据。现在将小数字段更改为 Number(10,2)。所以现在你最多只能存99999999.99。但你的旧数据远不止这些。因为之前您最多可以保存 300 位小数和 100 位小数。