Как уже отмечалось, «странное поведение», которое вы видите, связано с тем, что при округлении дробных значений VB6 использует Banker's Rounding.
Обновление 2: Добавление CInt не делает разница. CInt (5.5) дает 6 и Cint (8.5) дает 8 !!
Это также нормально. CInt
всегда совершает раунды (снова используя метод округления Banker) перед выполнением преобразования.
Если у вас есть номер с дробной частью и просто хотите обрезать его (игнорировать часть после десятичной точки), вы можете использовать либо Fix
или Int
функции:
Fix(1.5) = 1
Fix(300.4) = 300
Fix(-12.394) = -12
Int
работает Точно так же, как Fix
, за исключением того, что она округляет отрицательные числа к следующему-самому низкому отрицательному числу, за исключением:
Int(1.5) = 1
Int(300.4) = 300
Int(-12.394) = -13
Если вы на самом деле хотите round номер в соответствии с правилами, с которыми большинство людей знакомы, вам придется написать свою собственную функцию, чтобы сделать это. Ниже приведен пример скругления, который будет округлить когда дробная часть больше или равна .5, и округлить иначе:
EDIT: См MarkJ's answer для гораздо проще (и, вероятно, быстрее) версии этой функции.
' Rounds value to the specified number of places'
' Probably could be optimized. I just wrote it off the top of my head,'
' but it seems to work.'
Public Function RoundNumber(ByVal value As Double, Optional PlacesAfterDecimal As Integer = 0) As Double
Dim expandedValue As Double
Dim returnValue As Double
Dim bRoundUp As Boolean
expandedValue = value
expandedValue = expandedValue * 10^(PlacesAfterDecimal + 1)
expandedValue = Fix(expandedValue)
bRoundUp = (Abs(expandedValue) Mod 10) >= 5
If bRoundUp Then
expandedValue = (Fix(expandedValue/10) + Sgn(value)) * 10
Else
expandedValue = Fix(expandedValue/10) * 10
End If
returnValue = expandedValue/10^(PlacesAfterDecimal + 1)
RoundNumber = returnValue
End Function
Примеры
Debug.Print RoundNumber(1.6) '2'
Debug.Print RoundNumber(-4.8) '-5'
Debug.Print RoundNumber(101.7) '102'
Debug.Print RoundNumber(12.535, 2) '12.54'
Стоп говоря "бросок". Это не классификация типов, это преобразование типов. Существует большая разница. – Bob
Мой плохой. Спасибо за исправление броска – Tuxist
Tuxist, поэтому вы должны отредактировать свой вопрос и изменить «cast» и «casting» на «convert» и «conversion». – MarkJ