Учитывая числа, такие как 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 использует Rounders, до ближайшего четного числа, что может быть удивительно, если вы не знаете об этом:
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too
Спасибо всем.
Это простая математика. Учитывая число X и коэффициент округления N, формула будет:
round (X/N) * N
Чтобы округлить до ближайшего X (без специфики VBA)
N = X * int (N/X + 0,5)
Где int (...) возвращает следующее нижнее целое число.
Если ваша доступная функция округления уже округляется до ближайшего целого числа, то опустите добавление 0,5
int(N+0.5)
- это то же самое, что и round(N)
В VB math.round имеет дополнительные аргументы, чтобы указать количество десятичных знаков и метод округления. Math.Round(10.665, 2, MidpointRounding.AwayFromZero) вернется 10.67. Если число является десятичным или одиночным типом данных, math.round возвращает десятичный тип данных. Если он двойной, он возвращает двойной тип данных. Это может быть важно, если опция 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 - один из редких языков, которые обтекают преобразование типов (большинство других просто обрезают.)
Умножения 5 или x можно сделать просто делением до и умножением после раунда.
Если вы хотите округлить и сохранить десятичные знаки, Math.round(n, d) будет работать.
Чтобы имитировать Visual Basic, как работает круглая функция в Excel, вам просто нужно использовать: WorksheetFunction.Round(число, десятичный знак)
Таким образом, округление банковского или бухгалтерского учета не делает округления.
Попробуйте эту функцию
-------------- начать ----------------
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 run, который и получайте удовольствие, выясняя, почему 2 дают результат 2
вы не можете доверять раунду
msgbox round(1.5) 'result to 2
msgbox round(2.5) 'yes, result to 2 too