How to convert a floating-point type to an integer type without rounding in VB6
What is the recommended way to convert a floating point type to an integer type, truncating everything after the decim开发者_运维百科al point? CLng rounds, apparently, and the documentation for the = operator doesn't mention the subject.
UseFix
or Int
depending on the treatment you wish for negative numbers.
Microsoft article Q196652 discusses rounding in incredible detail. Here is an excerpt
The VB
Fix()
function is an example of truncation. For example,Fix(3.5)
is3
, andFix(-3.5)
is-3
.The
Int()
function rounds down to the highest integer less than the value. BothInt()
andFix()
act the same way with positive numbers - truncating - but give different results for negative numbers:Int(-3.5)
gives-4
.
Full disclosure: I referred to this nice answer by elo80ka
see this
Undocumented behavior of the CInt() function The CInt() function rounds to the nearest integer value. In other words, CInt(2.4) returns 2, and CInt(2.6) returns 3.
This function exhibits an under-documented behavior when the fractional part is equal to 0.5. In this case, this function rounds down if the integer portion of the argument is even, but it rounds up if the integer portion is an odd number. For example, CInt(2.5) returns 2, but CInt(3.5) returns 4.
This behavior shouldn't be considered as a bug, because it helps not to introduce errors when doing statistical calculations. UPDATE: Matthew Wills let us know that this behavior is indeed documented in VB6's help file: When the fractional part is exactly 0.5, CInt and CLng always round it to the nearest even number. For example, 0.5 rounds to 0, and 1.5 rounds to 2. CInt and CLng differ from the Fix and Int functions, which truncate, rather than round, the fractional part of a number. Also, Fix and Int always return a value of the same type as is passed in.
For positive numbers you would use
truncated = Int(value)
If used on negative numbers it would go down, i.e. -7.2 would become -8.
精彩评论