Как уже отмечали другие, "странное поведение", которое вы видите, связано с тем, что VB6 использует Банковское округление при округлении дробных значений.
Обновление 2: добавление CInt делает не
разница. CInt (5.5) дает 6 и
Cint (8.5) дает 8 !!
Это тоже нормально. CInt
всегда округляет (снова используя метод округления Банкира) перед выполнением конвертации.
Если у вас есть число с дробной частью и вы просто хотите его обрезать (игнорируйте часть после десятичной точки), вы можете использовать функцию 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
Если вы действительно хотите округлить число в соответствии с правилами, с которыми знакомо большинство людей, вам придется написать свою собственную функцию, чтобы сделать это. Ниже приведен пример округления, которое округляется в большую сторону, когда дробная часть больше или равна 0,5, и округляется в меньшую сторону в противном случае:
РЕДАКТИРОВАТЬ : См. Ответ MarkJ для более простой (и, вероятно, более быстрой) версии этой функции.
' 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'