バージョン 2.4 で 新たに追加 された仕様です。
decimal モジュールは10 進の浮動小数点算術をサポートします。 decimal には、 float() データ型に比べて、以下のような 利点があります:
>>> getcontext().prec = 6 >>> Decimal(1) / Decimal(7) Decimal("0.142857") >>> getcontext().prec = 28 >>> Decimal(1) / Decimal(7) Decimal("0.1428571428571428571428571429")
このモジュールは、 10 進数型、算術コンテキスト (context for arithmetic)、 そしてシグナル (signal) という三つの概念を中心に設計されています、
10 進数型は変更不可能な型です。この型には符号部、仮数部、そして指数部 があります。有効桁数を残すために、仮数部の末尾にあるゼロの切り詰めは 行われません。 decimal では、 Infinity, -Infinity, および NaN といった特殊な値も定義されています。 標準仕様では -0 と +0 も区別しています。
算術コンテキストとは、精度や値丸めの規則、指数部の制限を決めている 環境です。この環境では、演算結果を表すためのフラグや、演算上発生した 特定のシグナルを例外として扱うかどうかを決めるトラップイネーブラも 定義しています。丸め規則にはROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, および ROUND_UP があります。
シグナルとは、演算の過程で生じる例外的条件です。個々のシグナルは、 アプリケーションそれぞれの要求に従って、無視されたり、単なる情報と みなされたり、例外として扱われたりします。decimal モジュール には、Clamped, InvalidOperation, DivisionByZero, Inexact, Rounded, Subnormal, Overflow, および Underflow といったシグナルがあります。
各シグナルには、フラグとトラップイネーブラがあります。演算上 何らかのシグナルに遭遇すると、フラグはゼロからインクリメントされて ゆきます。このとき、もしトラップイネーブラが 1 にセットされて いれば、例外を送出します。フラグの値は膠着型 (sticky) なので、 演算によるフラグの変化をモニタしたければ、予めフラグをリセット しておかねばなりません。
参考:
IBM による汎用 10 進演算仕様、 The General Decimal Arithmetic Specification。
IEEE 標準化仕様 854-1987, IEEE 854 に関する非公式のテキスト。