リストHOME  リストOpen Source

四捨五入

概要

 本日は、チョイねたです。四捨五入をプログラムで実装するとどのようになるか、皆さんご存知でしょうか? 1度でも開発した経験があれば、そんなに難しくないのですが、意外と、経験がないとすぐに思いつかないのではないでしょうか?ちなみに標準では、エクセルのシート上から呼び出せる、ROUND、ROUNDUP、ROUNDDOWN関数などが用意されているようですが、アルゴリズムの勉強ということで、今回は、自分で作成してみましょう。

四捨五入の基本的なアルゴリズム

例えば、1.463という値を、少数点第2位で四捨五入するとする。

  1. 1.463を10倍し、少数点を四捨五入の位置にずらす。1.463 → 14.63
  2. 14.63の値に0.5を足す。14.63 → 15.13
  3. 15.13の整数部分だけ切り出す。(少数点以下を切り捨てる) 15.13 → 15
  4. 15を10で割って元の少数点位置に戻す。15 → 1.50
  5. 1.463を、少数点第2位で四捨五入すると、1.50になる。

次に、1.463を、少数点第3位で四捨五入するとする。

  1. 1.463を100倍し、少数点を四捨五入の位置にずらす。1.463 → 146.3
  2. 146.3の値に0.5を足す。146.3 → 146.8
  3. 146.8の整数部分だけ切り出す。(少数点以下を切り捨てる) 146.8 → 146
  4. 146を100で割って元の少数点位置に戻す。146 → 1.460
  5. 1.463を、少数点第3位で四捨五入すると、1.460になる。

 というわけで、上記の処理を関数に実装し、以下にソースを公開してみましたので、参考にしてみてください。

 また、エクセルのシート上から呼び出し可能な、ROUND関数をVBAのプログラムから使用するサンプルも以下に公開しているので、そちらも参考にしてみてください。

 ソースコードは、Microsoft社の製品 エクセル向けに書いたものなので、利用するには、ご使用のコンピュータに、エクセルがインストールされていることが、必須条件です。



ソースコード

関数仕様

    Public Function RoundOff(ByVal v As Variant, ByVal digit As Long) As Variant
        戻り値 : 四捨五入された値が返却される。
        引数v : 四捨五入される数値。
        引数digit : 四捨五入の位置。1は1の位、2は10の位、-1は少数点第1位、-2は第2位、…


 以下が、今回作成した四捨五入関数です。ちょっとしたプログラムなので、関数のコードのみ公開しています。


'四捨五入
Public Function RoundOff(ByVal v As Variant, ByVal digit As Long) As Variant
    Dim mlt_v10 As Variant
    
    'digit = 0 の場合は、何もせず、指定された値をそのまま返却
    If digit = 0 Then
        RoundOff = v
        Exit Function
        
    '整数部分
    'digit : 整数部の、digitの位で、四捨五入。
    ElseIf digit > 0 Then
        mlt_v10 = 10 ^ digit
        
        v = v / mlt_v10
        v = v + 0.5
        v = Int(v)
        v = v * mlt_v10
    
    '少数点以下
    'digit : 少数点第digit位で四捨五入
    Else
        mlt_v10 = 10 ^ (-digit - 1)
        
        v = v * mlt_v10
        v = v + 0.5
        v = Int(v)
        v = v / mlt_v10
        
    End If
    
    RoundOff = v
    
End Function

 以下は、エクセルシート上から呼び出せる標準のRound関数をVBAのプログラムから呼び出したサンプルコードです。私が、作成したオリジナルの関数とは仕様が少し違っているので、ご注意を。


'*** マクロで実行するテスト関数 ***
'Excel標準のRound関数は、
'第一引数 : 数値、
'第二引数 : 四捨五入の位置、1を指定すると、少数点第2位での四捨五入
Public Sub TestFunction()
    Dim v As Double
    
    'テストデータ
    v = 0.98473
    
    '*****************************************************************
    ' シートから呼び出せるExcel標準の関数は、
    ' WorksheetFunctionオブジェクトの
    ' 静的(Static)な関数となっているようです。
    ' 静的な関数は、オブジェクト名.関数名で呼び出せます。
    ' また、四捨五入の結果をイミディエイト・ウインドウに出力します。
    '*****************************************************************
    Debug.Print WorksheetFunction.Round(v, 0)   '少数点第1位で四捨五入
    Debug.Print WorksheetFunction.Round(v, 1)   '少数点第2位で四捨五入
    Debug.Print WorksheetFunction.Round(v, 2)   '少数点第3位で四捨五入
    Debug.Print WorksheetFunction.Round(v, 3)   '少数点第4位で四捨五入
    Debug.Print WorksheetFunction.Round(v, 4)   '少数点第5位で四捨五入

End Sub

※静的な関数とは、通常オブジェクトを動的に確保すると、オブジェクトの持っている関数(メソッド)もそのオブジェクトとともに、確保されプログラムコードに配置されます。しかし、静的な関数であることを明示しておけば、動的にオブジェクトを確保しても、一意のアドレスにその関数は配置されます。従って、複数オブジェクトを生成しても、静的(Static)であれば、その関数はメモリ上に一つしか配置されません。

静的な関数

免責事項

 作者は、本ソフトウェアの使用または使用不能から生じるコンピュータの故障、情報の消失、その他あらゆる直接的及び間接的被害に関して一切の責任を負いません。

不具合の報告

 ご使用にあたり、改善の要望、不具合の発生等ありましたら、画面下のアドレスまで、ご連絡頂きますよう、宜しくお願いいたします。ご面倒、ご不便をお掛けしますが、宜しくお願いいたします。


休日判定・ページのフッター
管理者のメールアドレス