忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

指定した精度の桁数に数値を切り上げ

指定された Decimal Double Long の値を、指定された桁で切り上げる関数です。

指定された値が正の場合は、有効桁数の10の累乗で割ったものを Math.Ceiling 関数で最小の整数値を求めて、更に累乗値を掛けてやります。 指定された値が負の場合は、有効桁数の10の累乗で割ったものを Math.Floor 関数で最小の整数値を求めて、更に累乗値を掛けてやります

テストプログラムの動作としては、Double値が「123456」で有効桁数が「3」の場合、「123456」を先ず「1000」で割って「123.456」となり Math.Ceiling 関数を通すことで「124.000」となり結果「124000」が関数戻り値となります。

指定した精度の桁数に数値を切り上げ

    ''' ------------------------------------------------------------------------
    ''' 
    ''' 指定した精度の数値の切り上げ
    ''' 
    ''' <param name="Val">丸め対象の倍精度浮動小数点数</param>
    ''' <param name="intUnit">戻り値の有効桁数の精度</param>
    ''' 切り上げられた数値。
    ''' ------------------------------------------------------------------------
    Public Function RoundUp(ByVal Val As Double, ByVal intUnit As Integer) As Double
        Dim dblPow As Double = System.Math.Pow(10, intUnit)

        If Val > 0 Then
            'Ceiling:指定した倍精度浮動小数点数以上の数のうち、最小の整数値を返します
            Return System.Math.Ceiling(Val / dblPow) * dblPow
        Else
            'Floor:指定した倍精度浮動小数点数以下の数のうち、最大の整数を返します
            Return System.Math.Floor(Val / dblPow) * dblPow
        End If
    End Function

    Public Function RoundUp(ByVal Val As Decimal, ByVal intUnit As Integer) As Decimal
        Dim decPow As Decimal = System.Math.Pow(10, intUnit)

        If Val > 0 Then
            'Ceiling:指定した 10 進数以上の数のうち、最小の整数値を返します
            Return System.Math.Ceiling(Val / decPow) * decPow
        Else
            'Floor:指定した 10 進数以下の数のうち、最大の整数を返します
            Return System.Math.Floor(Val / decPow) * decPow
        End If
    End Function

    Public Function RoundUp(ByVal Val As Long, ByVal intUnit As Integer) As Long
        Dim decPow As Decimal = System.Math.Pow(10, intUnit)

        If Val > 0 Then
            Return System.Math.Ceiling(Val / decPow) * decPow
        Else
            Return System.Math.Floor(Val / decPow) * decPow
        End If
    End Function

    '*****
    '仮にテストプログラム
    '*****
    Private Sub BtnRoundUp_Click(sender As Object, e As EventArgs) Handles BtnRoundUp.Click
        Try
            Dim decData As Decimal = 123456
            Dim dblData As Double = 123456
            Dim lngData As Long = 123456

            Dim str As String = ""
            str &= "Decimal:" & decData.ToString & "-->" & RoundUp(decData, 3).ToString & vbCrLf
            str &= "Double :" & dblData.ToString & "-->" & RoundUp(dblData, 2).ToString & vbCrLf
            str &= "Long   :" & lngData.ToString & "-->" & RoundUp(decData, 1).ToString & vbCrLf
            decData = -decData
            dblData = -dblData
            lngData = -lngData
            str &= "Decimal:" & decData.ToString & "-->" & RoundUp(decData, 3).ToString & vbCrLf
            str &= "Double :" & dblData.ToString & "-->" & RoundUp(dblData, 2).ToString & vbCrLf
            str &= "Long   :" & lngData.ToString & "-->" & RoundUp(decData, 1).ToString & vbCrLf
            MsgBox(str)

        Catch ex As Exception
            'エラー
            MsgBox(ex.Message)
        End Try
    End Sub
PR

コメント

コメントを書く