Global decimal rounding options in Django

后端 未结 4 742
生来不讨喜
生来不讨喜 2021-01-24 11:14

Decimal numbers are by default rounded very unexpectedly, in order to make it work normally, it is needed to use ROUND_HALF_UP option.

>>>          


        
相关标签:
4条回答
  • 2021-01-24 11:23

    Worked in 1.9.5 (based on comment from @ark):

    In myapp/apps.py

    from __future__ import unicode_literals
    import decimal
    from django.apps import AppConfig
    
    
    class MyAppConfig(AppConfig):
    
        name = 'myapp'
    
        def ready(self):
            # Set precision
            decimal.getcontext().prec = 9
            decimal.getcontext().rounding = decimal.ROUND_HALF_DOWN
    

    In settings.py

    INSTALLED_APPS = list(INSTALLED_APPS)
    INSTALLED_APPS.append('myapp.apps.MyAppConfig')
    
    0 讨论(0)
  • 2021-01-24 11:30

    Decimal doesn't have anything to do with Django, they are part of the standard python library. The getcontext function returns the context of the current thread, so if you're not doing anything funky, every request will be executed in one thread. That basically mean that setting the option in the settings.py file should be enough.

    0 讨论(0)
  • 2021-01-24 11:30

    For django project can work setting decimal.DefaultContext (py3, py2).

    This context is most useful in multi-threaded environments.

    This is my code from settings.py:

    import decimal
    # Set global decimal rounding to ROUND_HALF_UP (instead of ROUND_HALF_EVEN).
    project_context = decimal.getcontext()
    project_context.rounding = decimal.ROUND_HALF_UP
    decimal.DefaultContext = project_context
    

    Worked in 1.10. Based on my answer in this question.

    0 讨论(0)
  • 2021-01-24 11:39

    Actually it doesn't work like Viktor suggested (although in django 1.5).

    My solution is create and using a middleware like this:

    # -*- coding: utf-8 -*-
    
    import decimal
    from django.conf import settings
    
    
    class DecimalPrecisionMiddleware(object):
        def process_request(self, request):
            decimal_context = decimal.getcontext()
            decimal_context.prec = settings.DECIMAL_PRECISION # say: 4
    

    and then in settings.py:

    MIDDLEWARE_CLASSES = (
        'pathto.middleware.DecimalPrecisionMiddleware',
        # etc..
    )
    
    0 讨论(0)
提交回复
热议问题