Python
 Computer >> コンピューター >  >> プログラミング >> Python

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進モジュールで定義されている機能の使用について説明します。


  1. Pythonで現在の日付と時刻を取得するにはどうすればよいですか?

    複数の方法で現在の日付と時刻を取得できます。最も簡単な方法は、datetimeモジュールを使用することです。現在の日付と時刻を表示する機能があります。 例 import datetime now = datetime.datetime.now() print("Current date and time: ") print(str(now)) 出力 これにより、出力が得られます- 2017-12-29 11:24:48.042720 strftime関数を使用して、フォーマットされた日付と時刻を取得することもできます。目的の出力を取得するために使用できるフォーマット文

  2. Pythonで浮動小数点数を固定幅にフォーマットするにはどうすればよいですか?

    Pythonでは、文字列の書式設定を使用して、浮動小数点数を固定幅に書式設定できます。たとえば、小数点を12文字の幅と小数点の右側の4桁に揃える場合は、次を使用できます。 >>> x = 12.35874 >>> print "{:12.4f}".format(x)      12.3587 文字列の補間とフォーマットを使用して、この結果を達成することもできます。例: >>> x = 12.35874 >>> print "% 12.4f" % x &