Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python十进制精度和django DecimalField_Python_Django_Floating Point_Decimal_Rounding - Fatal编程技术网

python十进制精度和django DecimalField

python十进制精度和django DecimalField,python,django,floating-point,decimal,rounding,Python,Django,Floating Point,Decimal,Rounding,为什么我在这里得到了错误的精度?我问了浮点数后的3位小数 >>> from decimal import Decimal >>> from decimal import getcontext >>> getcontext().prec = 3 >>> Decimal(1.111) + Decimal(2.222) Decimal('3.33') # Why not 3.333? 第二个问题,对于djangoDecimal

为什么我在这里得到了错误的精度?我问了浮点数后的3位小数

>>> from decimal import Decimal
>>> from decimal import getcontext

>>> getcontext().prec = 3
>>> Decimal(1.111) + Decimal(2.222)
Decimal('3.33') # Why not 3.333?
第二个问题,对于django
DecimalField
,我对字段的定义如下:

value = models.DecimalField(max_digits=10, decimal_places=3)
它是否给出与设置相同的结果

getcontext().prec = 3
十进制的

  • prec
    设置相当于
    max_digits
    设置,因此如果尝试将200.222和300.333的小数相加,您将立即看到问题。要精确获得小数点后3位,可以使用
    round()
    函数,例如
    round(decimal(123.3334343),3)

  • 这个问题实际上在第一部分中得到了回答,但只是为了澄清:
    max_digits
    设置逗号前后的数字总数。
    decimal\u places
    指定存储的小数位数。
    因此,简短的答案是否定的:
    getcontext().prec=3
    !=<代码>小数位=3


  • 那么max_数字就像getcontext().prec?如果是这样,如何使用十进制模块控制小数位数(逗号后的位数)?i、 e django如何确保小数点?@user3599803我检查了源代码,django(1.9)使用了
    django.db.backends.utils.format\u number
    函数,定义为
    format\u number(value,max\u digits,decimal\u places)
    ,但它会返回我认为是字符串(不是事实,不是意见。如果你查找它,请告诉我)这个小数在数据库中存储为字符串。实际上在我的db-MySQL中,小数存储为decimal(10,3)数据类型。所以这里至少没有一根弦。。不管怎样,我仍然在看如何配置十进制对象小数点。如果有办法course@user3599803好的,您可以直接从字符串中提取小数(
    Decimal(“1.123”)
    works),因此如果您愿意,您仍然可以使用Django util函数来实现这一点。但这似乎有点过分,我会选择
    round()