499、73433、2348のような数字が与えられた場合、どのVBAを使用して最も近い5または10に丸めることができますか?または任意の番号?
5日まで:
499 -> 500
2348 -> 2350
7343 -> 7345
10までに:
499 -> 500
2348 -> 2350
7343 -> 7340
等.
統合回答
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
みんなありがとう
簡単な数学です。数値Xと丸め係数Nを指定すると、式は次のようになります。
ラウンド(X/N)* N
最も近いXに丸める(VBA固有ではない)
N = X * int(N/X + 0.5)
Int(...)は次に小さい整数を返します。
利用可能な丸め関数がすでにnearest整数に丸められている場合は、0.5の追加を省略します
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を返します。これにより、不一致が生じる可能性があります。
'例: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)
ソリューションは次のとおりです。
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)
厳密なVisual Basicアプローチでは、浮動小数点値を整数に変換して、その整数に丸めることができます。 VBは、型変換を丸めるまれな言語の1つです(他のほとんどは単に切り捨てます。)
5またはxの倍数は、ラウンドの前に分割してから乗算するだけで実行できます。
小数点以下の桁を丸めて保持する場合、Math.round(n、d)が機能します。
私は「コミュニティ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
この機能を試してください
- - - - - - - 開始 - - - - - - - -
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
- - - - - - -終わり - - - - - -
そんな感じ?
'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
単にROUND(x/5)* 5が仕事をするはずです。
コメントを追加できないので、これを使用します
vBSでそれを実行し、2が2の結果を与える理由を理解して楽しんでください
あなたはラウンドを信頼することはできません
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too