Pythonでの10進固定小数点および浮動小数点演算
浮動小数点数は、基数2の2進数としてメモリに表されます。その結果、浮動小数点の算術演算がおかしくなることがあります。 0.1と0.2を加算すると、次のような厄介な結果が生じる可能性があります-
>>> 0.1 + 0.2 0.30000000000000004
実際、これはバイナリ浮動小数点表現の性質です。これは、どのプログラミング言語でも一般的です。 Pythonは、高速で正しく丸められた浮動小数点演算を実行するための10進モジュールを提供します。
10進モジュールは、浮動小数点を希望どおりに表現するように設計されており、算術演算の結果は期待どおりです。表現と操作の精度レベルは28か所まで設定できます。
10進モジュールはDecimalクラスを定義します。 10進オブジェクトは、コンストラクターのパラメーターとして整数、数値表現の文字列、またはタプルを指定することで宣言できます
>>> from decimal import Decimal >>> d1 = Decimal(10) >>> d1 Decimal('10') >>> d2 = Decimal('10') >>> d2 Decimal('10')
タプルパラメーターには、符号(0は正、1は負)、数字のタプル、および指数の3つの要素が含まれます。例
>>> d3 = Decimal((1, (1, 2,3, 4), 2)) >>> d3 Decimal('-1.234E+5')
特定の精度の浮動小数点数を表すより便利な方法は、getcontext()関数によって現在のスレッドのコンテキスト環境を取得し、Decimalオブジェクトの精度を設定することです。
>>> from decimal import Decimal, getcontext >>> getcontext().prec = 5 >>> d3 = Decimal(10) >>> d4 = Decimal(3) >>> d3/d4 Decimal('3.3333')
コンテキストは、精度を決定し、丸め規則を定義し、指数の範囲を制限するために使用される算術演算の環境です。
decimal.getcontext() −アクティブなスレッドの現在のコンテキストを返します。
decimal.setcontext(c) −アクティブなスレッドの現在のコンテキストをcに設定します。
次の丸めモード定数は、10進モジュールで定義されています-
ROUND_CEILING | 無限に向かって丸めます。 |
ROUND_DOWN | ゼロに向かって丸めます。 |
ROUND_FLOOR | -Infinityに向かって丸めます。 |
ROUND_HALF_DOWN | 同点がゼロに近づくように最も近い値に丸めます。 |
ROUND_HALF_EVEN | 最も近い整数に四捨五入し、最も近い偶数の整数に丸めます。 |
ROUND_HALF_UP | タイがゼロから離れる方向に最も近い値に丸めます。 |
ROUND_UP | ゼロから丸めます。 |
ROUND_05UP | ゼロに丸めた後の最後の桁が0または5だった場合は、ゼロから丸めます。それ以外の場合はゼロに向かって丸めます。 |
次のコードスニペットは、コンテキストオブジェクトの精度と丸めパラメータを使用しています
>>> from decimal import * >>> getcontext().prec = 5 >>> getcontext().rounding = ROUND_UP >>> d1 = Decimal(100) >>> d2 = Decimal(6) >>> d1/d2 Decimal('16.667')
10進オブジェクトの算術演算
通常の算術演算はすべて、通常のfloatと同様に、Decimalオブジェクトに対して実行されます。
>>> a = Decimal('2.4') >>> b = Decimal('1.2') >>> a + b Decimal('3.6') >>> a - b Decimal('1.2') >>> b - a Decimal('-1.2') >>> a * b Decimal('2.88') >>> a / b Decimal('2')
算術演算は、1つの10進オペランドと1つの整数オペランドで実行できます。ただし、通常の浮動小数点オブジェクトの操作は無効です。
>>> a = Decimal('2.4') >>> c = 2.1 >>> a + c Traceback (most recent call last): File "<pyshell#37>", line 1, in <module> a+c TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
すべての算術演算で同じ例外が発生します。
Decimalオブジェクトでの剰余(%)演算子の動作は、通常の数値型とは少し異なります。ここで、結果の兆候は除数ではなく配当の兆候です
>>> -7%3 2 >>> 7%-3 -2 >>> Decimal(-7) % Decimal(3) Decimal('-1') >>> Decimal(7) % Decimal(-3) Decimal('1')
Decimal.from_float() −この関数は、通常のfloatを正確なバイナリ表現のDecimalオブジェクトに変換します。結果として、from_float(0.1)とDecimal( '0.1')は同じではありません。
>>> d1 = Decimal('0.1') >>> d2 = Decimal.from_float(0.1) >>> d1,d2 (Decimal('0.1'), Decimal('0.1000000000000000055511151231257827021181583404541015625'))
この記事では、Python標準ライブラリの10進モジュールで定義されている機能の使用について説明します。
-
Pythonで現在の日付と時刻を取得するにはどうすればよいですか?
複数の方法で現在の日付と時刻を取得できます。最も簡単な方法は、datetimeモジュールを使用することです。現在の日付と時刻を表示する機能があります。 例 import datetime now = datetime.datetime.now() print("Current date and time: ") print(str(now)) 出力 これにより、出力が得られます- 2017-12-29 11:24:48.042720 strftime関数を使用して、フォーマットされた日付と時刻を取得することもできます。目的の出力を取得するために使用できるフォーマット文
-
Pythonで浮動小数点数を固定幅にフォーマットするにはどうすればよいですか?
Pythonでは、文字列の書式設定を使用して、浮動小数点数を固定幅に書式設定できます。たとえば、小数点を12文字の幅と小数点の右側の4桁に揃える場合は、次を使用できます。 >>> x = 12.35874 >>> print "{:12.4f}".format(x) 12.3587 文字列の補間とフォーマットを使用して、この結果を達成することもできます。例: >>> x = 12.35874 >>> print "% 12.4f" % x &