Djangoチップ:お金のためにDecimalfieldを使ってください


Djangoでお金の価値で働くとき、最初の考えはモデルで通貨を表すためにFloatFieldを使うことです.しかしながら、FloatFieldは、いくつかの精度問題が付属するfloatタイプを内部的に使用します.

問題


このコードを見てください.これはPythonでの浮動小数点数の簡単な操作です.
>>> .1 + .1 + .1 == .3
False
>>> .1 + .1 + .1
0.30000000000000004
通常、あなたは、追加が意味をなすと思いますが、float近似によるいくつかの問題のため、式は3に等しくありません.
あなたはこれらの問題を丸めを使用して修正することができますが、お金の値と精度の問題に対処している場合は、小数を使用する時間があります.

解決策


基本的には、浮動小数点の代わりに小数点を使用するときに精度が重要です.前の例を書き直しましょう.
>>> from decimal import Decimal
>>> Decimal('.1') + Decimal('.1') + Decimal('.1') == Decimal('.3')
True
>>> Decimal('.1') + Decimal('.1') + Decimal('.1')
Decimal('0.3')
ここで、小数点値を文字列値で初期化します.Floatsを使用することができますが、先に述べたように、floatには近似問題があります.
その後、DjangoでDecimalでDecimalで働くとき、フィールドを定義するとき、それは正確にDecimalRange場所属性に正確な習慣です.

class Product(models.Model):
    title = models.CharField(max_length=64)
    description = models.TextField()

    price = models.DecimalField(max_digits=6, decimal_places=2)
あなたはDecimalField hereについての詳細を学ぶことができます.
bloggu.io .無料でお試しください.