web-dev-qa-db-ja.com

数値を最も近い5または10またはXに丸める

499、73433、2348のような数字が与えられた場合、どのVBAを使用して最も近い5または10に丸めることができますか?または任意の番号?

5日まで:

 499 ->  500
2348 -> 2350
7343 -> 7345

10までに:

 499 ->  500
2348 -> 2350
7343 -> 7340

等.

58
matt wilkie

統合回答

X = 1234 'number to round
N = 5    'rounding factor
round(X/N)*N   'result is 1235

浮動小数点から整数、1234.564から1235の場合(これはVB特定、他のほとんどの言語は単に切り捨てられます)):

int(1234.564)   'result is 1235

注意:VBは Bankers Rounding を使用し、最も近い偶数に設定します。それを認識して:

msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too

みんなありがとう

32
matt wilkie

簡単な数学です。数値Xと丸め係数Nを指定すると、式は次のようになります。

ラウンド(X/N)* N

89
Vilx-

最も近いXに丸める(VBA固有ではない)

N = X * int(N/X + 0.5)

Int(...)は次に小さい整数を返します。

利用可能な丸め関数がすでにnearest整数に丸められている場合は、0.5の追加を省略します

11
Alnitak

VBでは、math.roundには、小数点以下の桁数と丸め方法を指定する追加の引数があります。 Math.Round(10.665、2、MidpointRounding.AwayFromZero)は10.67を返します。数値が10進数または単一データ型の場合、math.roundは10進数データ型を返します。 doubleの場合、doubleデータ型を返します。オプションstrictがオンの場合、これは重要かもしれません。

(10.665).ToString( "n2")の結果はゼロから四捨五入して "10.67"になります。追加の引数を指定しないと、math.roundは10.66を返します。これにより、不一致が生じる可能性があります。

9
Bob

'例:499を最も近い5に丸めます。ROUND()関数を使用します。

a = inputbox("number to be rounded")
 b = inputbox("Round to nearest _______ ")


  strc = Round(A/B)
  strd = strc*B


 msgbox( a & ",  Rounded to the nearest " & b & ", is" & vbnewline & strd)
3
Joey

ソリューションは次のとおりです。

Public Enum RoundingDirection
    Nearest
    Up
    Down
End Enum

Public Shared Function GetRoundedNumber(ByVal number As Decimal, ByVal multiplier As Decimal, ByVal direction As RoundingDirection) As Decimal
    Dim nearestValue As Decimal = (CInt(number / multiplier) * multiplier)
    Select Case direction
        Case RoundingDirection.Nearest
            Return nearestValue
        Case RoundingDirection.Up
            If nearestValue >= number Then
                Return nearestValue
            Else
                Return nearestValue + multiplier
            End If
        Case RoundingDirection.Down
            If nearestValue <= number Then
                Return nearestValue
            Else
                Return nearestValue - multiplier
            End If
    End Select
End Function

使用法:

dim decTotal as Decimal = GetRoundedNumber(CDec(499), CDec(0.05), RoundingDirection.Up)
1
James Berard

厳密なVisual Basicアプローチでは、浮動小数点値を整数に変換して、その整数に丸めることができます。 VBは、型変換を丸めるまれな言語の1つです(他のほとんどは単に切り捨てます。)

5またはxの倍数は、ラウンドの前に分割してから乗算するだけで実行できます。

小数点以下の桁を丸めて保持する場合、Math.round(n、d)が機能します。

1

私は「コミュニティwiki」(ベストアンサー)が提供する関数をわずかに更新しましたが、この例外を除いて、最も近い5(またはあなたが好きなもの)に丸めました:元の番号に

これは、「ある会社は47年間生き続けている」と言う必要がある場合に役立ちます。:Webページを表示したい "45年以上生きている"、言いながら横になることを避ける "50年以上生きている"

したがって、この関数に47を指定すると、50は返されませんが、代わりに45が返されます。

'Rounds a number to the nearest unit, never exceeding the actual value
function RoundToNearestOrBelow(num, r)

    '@param         num         Long/Integer/Double     The number to be rounded
    '@param         r           Long                    The rounding value
    '@return        OUT         Long                    The rounded value

    'Example usage :
    '   Round 47 to the nearest 5 : it will return 45
    '   Response.Write RoundToNearestBelow(47, 5)

    Dim OUT : OUT = num

    Dim rounded : rounded = Round((((num)) / r), 0) * r

    if (rounded =< num) then
        OUT = rounded
    else
        OUT = rounded - r
    end if

    'Return
    RoundToNearestOrBelow = OUT

end function 'RoundToNearestOrBelow
0
AlexLaforge

この機能を試してください

- - - - - - - 開始 - - - - - - - -

Function Round_Up(ByVal d As Double) As Integer
    Dim result As Integer
    result = Math.Round(d)
    If result >= d Then
        Round_Up = result
    Else
        Round_Up = result + 1
    End If
End Function

- - - - - - -終わり - - - - - -

0
ana

そんな感じ?

'nearest
 n = 5
 'n = 10

 'value
 v = 496
 'v = 499 
 'v = 2348 
 'v = 7343

 'mod
 m = (v \ n) * n

 'diff between mod and the val
 i = v-m


 if i >= (n/2) then     
      msgbox m+n
 else
      msgbox m
 end if
0
Fredou

単にROUND(x/5)* 5が仕事をするはずです。

0

コメントを追加できないので、これを使用します

vBSでそれを実行し、2が2の結果を与える理由を理解して楽しんでください

あなたはラウンドを信頼することはできません

 msgbox round(1.5) 'result to 2
 msgbox round(2.5) 'yes, result to 2 too
0
Fredou