2016-11-17 16 views
1

ここで間違った精度が得られるのはなぜですか?私はfloaingポイントの後に10桁の3桁を求めました。pythonの小数精度とdjango DecimalField

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

>>> getcontext().prec = 3 
>>> Decimal(1.111) + Decimal(2.222) 
Decimal('3.33') # Why not 3.333? 

そして2つ目の質問、ジャンゴDecimalFieldのために、私はこのように私のフィールドを定義します。

value = models.DecimalField(max_digits=10, decimal_places=3) 

それは十進のため

getcontext().prec = 3 

を設定した場合と同じ結果が得られるのでしょうか? max_digits設定として

答えて

4
  1. prec設定行為あなたが一緒に200.222と300.333の小数点以下を追加しようとした場合、あなたはすぐに問題が表示されますので。小数点以下3桁を正確に取得するには、round()関数をround(Decimal(123.3334343), 3)として使用します。

  2. その質問、実際に最初の部分で答えているが、ちょうど明確にする:あなたがカンマの前と後の両方の合計で持つことができますどのように多くの桁
    max_digitsセット。
    decimal_placesは、格納される小数点以下の桁数を指定します。
    したがって、短い答えはno:getcontext().prec = 3!= decimal_places=3です。

+0

したがって、max_digitsはgetcontext()と同じです。prec?もしそうなら、小数点以下の桁数(カンマの後の桁数)を小数点以下の桁で制御するにはどうすればいいですか?つまり、djangoはdecimal_placesを確保するために何をしますか? – user3599803

+0

@ user3599803ソースコードをチェックしたところ、Django(1.9)は 'django.db.backends.utils.format_number'関数を' format_number(value、max_digits、decimal_places) 'の定義で使用していましたが、実際には、意見ではありません。あなたがそれを見て、私に教えてください)10進数は、データベースに文字列として格納されます。 – makaveli

+0

実際に私のdb - MySQLでは、小数はDECIMAL(10,3)データ型として格納されます。だから少なくともここでは文字列ではありません。とにかく、Decimalオブジェクトのdecimal_placesの設定方法はまだ見えます。方法がある場合 – user3599803