【Python】round関数を使わずに四捨五入する方法

この記事では、Pythonの基本的な四捨五入方法から、round関数の限界、そして手動で四捨五入を実装する方法までを詳しく解説します。

さらに、リストやデータフレーム内の数値を四捨五入する実践的な例も紹介します。

初心者でも理解しやすいように、サンプルコードとその解説を交えながら進めていきますので、ぜひ最後までお読みください。

目次から探す

Pythonでの四捨五入の基本

四捨五入は、数値を指定した桁数に丸めるための基本的な操作です。

Pythonでは、round関数を使って簡単に四捨五入を行うことができます。

しかし、特定の状況ではround関数が期待通りに動作しないことがあります。

ここでは、まずround関数の使い方とその限界について説明します。

round関数の使い方

round関数は、数値を指定した小数点以下の桁数に四捨五入するための組み込み関数です。

基本的な使い方は以下の通りです。

# 小数点以下2桁に四捨五入
rounded_value = round(3.14159, 2)
print(rounded_value)  # 出力: 3.14

round関数は2つの引数を取ります。

最初の引数は四捨五入したい数値、2つ目の引数は小数点以下の桁数です。

上記の例では、3.14159を小数点以下2桁に四捨五入して3.14が得られます。

round関数の限界と問題点

round関数は便利ですが、いくつかの限界や問題点があります。

特に、浮動小数点数の表現に起因する問題が発生することがあります。

浮動小数点数の誤差

浮動小数点数は、コンピュータ内部での表現に限界があるため、正確に表現できない数値があります。

これにより、round関数を使用しても期待通りの結果が得られないことがあります。

# 浮動小数点数の誤差の例
print(round(2.675, 2))  # 出力: 2.67 (期待される出力は2.68)

上記の例では、2.675を小数点以下2桁に四捨五入すると2.68が期待されますが、実際には2.67が出力されます。

これは、2.675が内部的に正確に表現されていないためです。

特定のケースでの不一致

round関数は、特定のケースで期待通りに動作しないことがあります。

例えば、0.5のような中間値を四捨五入する場合、Pythonのround関数は偶数への丸め(バンク家の丸め)を行います。

# 偶数への丸めの例
print(round(0.5))  # 出力: 0
print(round(1.5))  # 出力: 2

上記の例では、0.50に、1.52に四捨五入されます。

これは、偶数への丸めが行われているためです。

この動作は、特定の状況では予期しない結果をもたらすことがあります。

これらの限界や問題点を理解した上で、次にround関数を使わずに四捨五入を行う方法について説明します。

四捨五入を手動で実装する

Pythonで四捨五入を行う際に、round関数を使わずに手動で実装する方法について解説します。

手動で四捨五入を行うことで、より細かい制御が可能となり、特定の要件に応じたカスタマイズができます。

基本的な考え方

四捨五入の基本的な考え方は、数値の小数点以下の部分を確認し、特定の基準に従って整数部分を調整することです。

具体的には、小数点以下の数値が0.5以上であれば切り上げ、それ未満であれば切り捨てます。

以下に、基本的な四捨五入の手動実装例を示します。

def manual_round(number):
    if number - int(number) >= 0.5:
        return int(number) + 1
    else:
        return int(number)
# 使用例
print(manual_round(3.6))  # 出力: 4
print(manual_round(3.4))  # 出力: 3

この関数では、まず数値の小数点以下の部分を取得し、それが0.5以上かどうかを確認しています。

0.5以上であれば整数部分に1を加え、そうでなければそのまま整数部分を返します。

小数点以下の桁数を指定する方法

四捨五入を行う際に、小数点以下の桁数を指定したい場合があります。

これを実現するためには、数値を適切にスケーリングしてから四捨五入を行い、再度スケーリングを戻す必要があります。

文字列操作を使った方法

文字列操作を使って小数点以下の桁数を指定する方法を紹介します。

この方法では、数値を文字列に変換し、必要な桁数で切り捨てた後に再度数値に変換します。

def round_with_string(number, digits):
    format_str = "{:." + str(digits) + "f}"
    return float(format_str.format(number))
# 使用例
print(round_with_string(3.14159, 2))  # 出力: 3.14
print(round_with_string(3.14159, 3))  # 出力: 3.142

この関数では、まずフォーマット文字列を作成し、それを使って数値を指定された桁数にフォーマットします。

フォーマットされた文字列を再度浮動小数点数に変換して返します。

数学的な操作を使った方法

数学的な操作を使って小数点以下の桁数を指定する方法もあります。

この方法では、数値を10の指定桁数乗でスケーリングし、四捨五入を行った後に再度スケーリングを戻します。

def round_with_math(number, digits):
    factor = 10 ** digits
    return int(number * factor + 0.5) / factor
# 使用例
print(round_with_math(3.14159, 2))  # 出力: 3.14
print(round_with_math(3.14159, 3))  # 出力: 3.142

この関数では、まず数値を10の指定桁数乗で掛けてスケーリングします。

その後、四捨五入を行い、再度スケーリングを戻すために10の指定桁数乗で割ります。

これらの方法を使うことで、round関数を使わずに四捨五入を実装することができます。

特定の要件に応じて、文字列操作や数学的な操作を使い分けると良いでしょう。

応用例

リスト内の数値を四捨五入する

Pythonでリスト内の数値を四捨五入する方法について解説します。

リスト内の各要素に対して四捨五入を行うためには、リスト内包表記やループを使用することが一般的です。

実装コード

以下は、リスト内の数値を四捨五入するためのサンプルコードです。

# 四捨五入を手動で行う関数
def custom_round(number, digits):
    factor = 10 ** digits
    return int(number * factor + 0.5) / factor
# サンプルのリスト
numbers = [1.234, 2.345, 3.456, 4.567, 5.678]
# 小数点以下2桁で四捨五入
rounded_numbers = [custom_round(num, 2) for num in numbers]
print(rounded_numbers)

コードの解説

  1. custom_round関数は、四捨五入を手動で行うための関数です。

numberは四捨五入したい数値、digitsは小数点以下の桁数を指定します。

  1. factorは、指定された桁数に応じて10のべき乗を計算します。

例えば、digitsが2の場合、factorは100になります。

  1. 数値をfactorで掛けてから0.5を足し、整数に変換します。

これにより、四捨五入が実現されます。

  1. 最後に、元の桁数に戻すためにfactorで割ります。
  2. numbersリストには、四捨五入したい数値が含まれています。
  3. リスト内包表記を使用して、numbersリスト内の各要素に対してcustom_round関数を適用し、結果をrounded_numbersリストに格納します。
  4. 最後に、rounded_numbersリストを出力します。

データフレーム内の数値を四捨五入する

次に、Pandasデータフレーム内の数値を四捨五入する方法について解説します。

Pandasはデータ操作に非常に便利なライブラリで、データフレーム内の数値を簡単に操作できます。

実装コード

以下は、データフレーム内の数値を四捨五入するためのサンプルコードです。

import pandas as pd
# 四捨五入を手動で行う関数
def custom_round(number, digits):
    factor = 10 ** digits
    return int(number * factor + 0.5) / factor
# サンプルのデータフレーム
data = {
    'A': [1.234, 2.345, 3.456],
    'B': [4.567, 5.678, 6.789]
}
df = pd.DataFrame(data)
# 小数点以下2桁で四捨五入
df_rounded = df.applymap(lambda x: custom_round(x, 2))
print(df_rounded)

コードの解説

  1. pandasライブラリをインポートします。
  2. custom_round関数は、リスト内の数値を四捨五入するために使用したものと同じです。
  3. data辞書には、データフレームに変換するためのサンプルデータが含まれています。
  4. pd.DataFrameを使用して、data辞書からデータフレームを作成します。
  5. applymapメソッドを使用して、データフレーム内の各要素に対してcustom_round関数を適用します。

lambda関数を使用して、custom_round関数に小数点以下2桁を指定します。

  1. 最後に、四捨五入されたデータフレームを出力します。

これらの方法を使用することで、リストやデータフレーム内の数値を簡単に四捨五入することができます。

Pythonの基本的な操作を理解していれば、これらの手法を応用してさまざまなデータ操作を行うことができます。

目次から探す