訊號代表在計算期間引發的條件。每個訊號對應於一個上下文旗標和一個上下文陷阱啟用器。上下文旗標會在遇到特定條件時設定,偵測旗標後可以獲得計算的詳細資訊。在開始下一次計算之前,應確保清除所有旗標。如果為訊號設定了上下文陷阱啟用器,則在遇到條件時會引發特定的Python異常。
decimal.Clamped
Emin
和 Emax
限制時發生限位。會向係數添加零來將指數縮減至符合限制。decimal.DecimalException
ArithmeticError
。decimal.DivisionByZero
Infinity
或 -Infinity
,由計算的輸入決定正負符號。decimal.Inexact
decimal.InvalidOperation
NaN
。可能的原因包括:
Infinity - Infinity
0 * Infinity
Infinity / Infinity
x % 0
Infinity % x
sqrt(-x)
且 x > 0
0 ** 0
x ** (non-integer)
x ** Infinity
decimal.Overflow
Context.Emax
時發生。如果未被捕獲,結果將取決於舍入模式,向下舍入為最大的可表示有限數值,或向上舍入為 Infinity
。無論哪種情況,都會發出 Inexact
和 Rounded
訊號。decimal.Rounded
5.00
舍入到 5.0
),也會發出此訊號。如果未被捕獲,則會返回未修改的結果。此訊號用於偵測有效位數的丟棄。decimal.Subnormal
decimal.Underflow
Inexact
和 Subnormal
訊號。decimal.FloatOperation
float
和 Decimal
的混合運算啟用更嚴格的語意。如果訊號未被捕獲(預設),則允許 float
和 Decimal
的混合,並且轉換和比較都是完全精確的。發生的任何混合運算都會透過在上下文旗標中設定 FloatOperation
來靜默地記錄。透過 from_float()
或 create_decimal_from_float()
進行明確轉換則不會設定旗標。在其他情況下(即訊號被捕獲),則只靜默執行相等性比較和明確轉換,所有其他混合運算都會引發 FloatOperation
。以下表格總結了訊號的層級結構:
exceptions.ArithmeticError(exceptions.Exception)
└── DecimalException
├── Clamped
├── DivisionByZero (DecimalException, exceptions.ZeroDivisionError)
├── Inexact
│ ├── Overflow (Inexact, Rounded)
│ └── Underflow (Inexact, Rounded, Subnormal)
├── InvalidOperation
├── Rounded
├── Subnormal
└── FloatOperation (DecimalException, exceptions.TypeError)