Pythonで小数点の四捨五入/切り捨て/切り上げを行う

2021年5月8日土曜日

Python 小数点丸め

t f B! P L

小数点の切捨て・切上げ・四捨五入

Pythonのdecimalモジュールを使って、小数点の丸めを行っていきます。
丸めには、Decimalオブジェクトの quantize() 関数を使います。

スポンサーリンク

quantize() 関数の使い方

小数点以下を切り上げる例です。

# coding: utf-8
from decimal import *

Decimal(str("1.5")).quantize(Decimal('0'), rounding=ROUND_UP)
  #-> 2

quantize()は、第一引数で丸めを行う小数点桁数、第二引数で丸めオプションを指定します。
この引数について、以降に詳しく解説していきます。

小数を任意の桁数で丸める

quantize()の第一引数に、丸める桁数と同じ少数点桁数の数値を、'0.1''0.01'のように文字列で指定します。

  • 少数点第二位で丸める
Decimal(str("1.25")).quantize(Decimal('0.1'), rounding=ROUND_UP)
  #=> 1.3
  • 整数1の位を丸める

少数だけでなく、整数も丸める事が出来ます。
但し、整数で丸める場合は、指数表記の文字列で指定する必要があります。

Decimal(str("15.00")).quantize(Decimal('1E1'), rounding=ROUND_UP)
  #=> 2E+1

スポンサーリンク

丸めオプションを指定する

quantize()の第二引数には、丸めオプションを指定します。
指定可能なオプションは、以下のいずれかです。

  • ROUND_CEILING

正の無限大に近づくように丸めるモードです。

value.quantize(Decimal('0'), rounding=ROUND_CEILING)
# 10.1 -> 11
# 10.5 -> 11
# -10.1 -> -10
# -10.5 -> -10
  • ROUND_DOWN

0 に近づくように丸めるモードです。(切り捨て)

value.quantize(Decimal('0'), rounding=ROUND_DOWN)
# 10.1 -> 10
# 10.5 -> 10
# -10.1 -> -10
# -10.5 -> -10
  • ROUND_FLOOR

負の無限大に近づくように丸めるモードです。

value.quantize(Decimal('0'), rounding=ROUND_FLOOR)
# 10.1 -> 10
# 10.5 -> 10
# -10.1 -> -11
# -10.5 -> -11
  • ROUND_HALF_DOWN

「もっとも近い数字」に丸めるモードです。(五捨六入)

value.quantize(Decimal('0'), rounding=ROUND_HALF_DOWN)
# 10.1 -> 10
# 10.5 -> 10
# 10.6 -> 11
# -10.1 -> -10
# -10.5 -> -10
# -10.6 -> -11
  • ROUND_HALF_EVEN

「もっとも近い数字」に丸める丸めモードです。
※両隣りの数字が等距離の場合は偶数側に丸められます

value.quantize(Decimal('0'), rounding=ROUND_HALF_EVEN)
# 10.1 -> 10
# 10.5 -> 10
# 10.6 -> 11
# 11.1 -> 11
# 11.5 -> 12
# 11.6 -> 12
  • ROUND_HALF_UP

「もっとも近い数字」に丸める丸めモードです(四捨五入)
※両隣りの数字が等距離の場合は切り上げられます

value.quantize(Decimal('0'), rounding=ROUND_HALF_UP)
# 10.1 -> 10
# 10.5 -> 11
# 10.6 -> 11
# 11.1 -> 11
# 11.5 -> 12
# 11.6 -> 12
  • ROUND_UP

0 から離れるように丸めるモードです。(切り上げ)

value.quantize(Decimal('0'), rounding=ROUND_UP)
# 10.1 -> 11
# 10.5 -> 11
# 10.6 -> 11
# 11.1 -> 12
# 11.5 -> 12
# 11.6 -> 12
  • ROUND_05UP

少し変わった丸めです。
0に近づくように丸め(切り捨て)た結果の最後の数字が 0 または 5 の場合、0から離れる丸め(切り上げ)を行います。

例えば「0.54」を小数点第二位で、切り捨てした場合、結果は「0.5」になります。
この時、最後の数字が「5」になる為、ROUND_05UPでは元の数字の「0.54」を切り上げを行い、その結果を、最終的な丸め結果として返します。

実際に試した結果は以下の通りです。

value.quantize(Decimal('0'), rounding=ROUND_05UP)
# 0.51 -> 0.6
# 0.55 -> 0.6
# 0.61 -> 0.6
# 0.65 -> 0.6
# 0.01 -> 0.1
# 0.06 -> 0.1

スポンサーリンク

関連記事

MacにPython3をインストールする! (サクッとインストールしたい人向け)

Mac環境に、Python3を簡単にインストールする方法を紹介しています。

Python3入門! 基礎をおさらい (変数/演算子/条件分岐/繰り返し)

1つの記事に、基本文法をまとめて書いているので、時間が空いて忘れてしまった場合でも、一気に復習出来るようになっています。よければ見てください。

Flaskでソースの変更を検知して、Webアプリを自動リロードする[Python Tips]

Flaskの開発で、ソースを更新したら、自動的にWebアプリをリロードする方法です。

Flaskで REST API開発する! 直ぐに実行できるサンプルコードで解説 【Python Tips】

Pythonの軽量Webフレームワークである、FlaskでREST APIを作るまでの流れを、紹介します。

Flask-RESTful を使って、REST APIを作る【Python Tips】

Flaskと、Flask-RESTfulを使って、REST APIを作ります。
Flask-RESTfulを使うと、オブジェクト思考な感じで、REST APIが作れます。

Pythonで正規表現を使って数値/英字チェックを実装する (コピペ用)

数値/半角英字などのチェック処理を、Pythonの正規表現を使って実装します。
コピペで簡単に使えるようになっています。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ