Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VBA: Strange behavior with Int function

I am wondering about this behavior that I see in VBA. I am using the Immediate console to debug my code and got the following result:

Debug.Print(Int(0.00024575*10000000+0.5))
 2457

I would expect this result to be 2458. Does anyone know why this is occurring? As expected, before the Int function is called, the calculation is in Double precision.

Debug.Print(VarType(0.00024575*10000000+0.5))
 5 

Any help is greatly appreciated!

like image 803
Atreyu Avatar asked Sep 07 '25 19:09

Atreyu


1 Answers

If you run the following test:

Sub Test()
    Dim d As Double: d = 0.5 + 0.00024575 * 10000000
    
    Debug.Assert d = Int(d)
    Debug.Assert 0.5 + 2457.5 = Int(0.5 + 2457.5)
    Debug.Assert 0.5 + 0.00024575 * 10000000 = Int(CDbl(0.5 + 0.00024575 * 10000000))
    Debug.Assert 0.5 + 0.00024575 * 10000000 = CDbl(0.5 + 0.00024575 * 10000000)
    Debug.Assert 0.5 + 0.00024575 * 10000000 = VBA.Int(0.5 + 0.00024575 * 10000000)
    Debug.Assert 0.5 + 0.00024575 * 10000000 = Int(0.5 + 0.00024575 * 10000000)
End Sub

You will see that only the last Assert fails. This is probably a compiler bug.

Note that Int is not the same as VBA.Int.

Edit #1

As suggested in the comments by @GSerg, it appears that the Int method (not VBA.Int) does indeed calculate at compile time and it probably uses a different floating point precision. For example:

Option Explicit

#Const Test = Int(12.5)

Sub TestPrecompiler()
    #If Test = 12 Then
        Debug.Print "Int method calculates at compile time"
    #End If
End Sub
like image 195
Cristian Buse Avatar answered Sep 10 '25 18:09

Cristian Buse