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

新手上路,请多包涵

我有一个 django 字段 total_pricepostgres 数据库版本 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),
        ),
    ]

当我运行命令时 python manage.py migrate

我从 postgresql 得到一个错误:

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

原文由 Mahammad Adil Azeem 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
1 个回答

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

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

假设,如果我们有一个用 NUMERIC(10,3) 定义的列。

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

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

一种解决方案可能是:

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

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

原文由 bh4r4th 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题