Code:
'BNRound - Not Banker's Rounding
'By Colin Schmidt, [EMAIL="[email protected]"][email protected][/EMAIL], released to public domain, use at own risk
 
FUNCTION NBRound(BYVAL pxVal AS EXT, BYVAL plDec AS LONG) AS EXT
    FUNCTION = (CQUD(((ABS(pxVal) * (10 ^ plDec)) * 2) + 0.5) \ 2) / (10 ^ plDec) * SGN(pxVal)
END FUNCTION
 
FUNCTION PBMAIN
    ?   FORMAT$(NBRound(-03.502, 0)) + $CR + _
        FORMAT$(NBRound(-03.501, 0)) + $CR + _
        FORMAT$(NBRound(-03.500, 0)) + $CR + _
        FORMAT$(NBRound(-03.499, 0)) + $CR + _
        FORMAT$(NBRound(-03.498, 0)) + $CR + _
        $CR+ _
        FORMAT$(NBRound( 03.502, 0)) + $CR + _
        FORMAT$(NBRound( 03.501, 0)) + $CR + _
        FORMAT$(NBRound( 03.500, 0)) + $CR + _
        FORMAT$(NBRound( 03.499, 0)) + $CR + _
        FORMAT$(NBRound( 03.498, 0)) + $CR + _
        $CR+ _
        FORMAT$(NBRound(-01.252, 1)) + $CR + _
        FORMAT$(NBRound(-01.251, 1)) + $CR + _
        FORMAT$(NBRound(-01.250, 1)) + $CR + _
        FORMAT$(NBRound(-01.249, 1)) + $CR + _
        FORMAT$(NBRound(-01.248, 1)) + $CR + _
        $CR+ _
        FORMAT$(NBRound( 01.252, 1)) + $CR + _
        FORMAT$(NBRound( 01.251, 1)) + $CR + _
        FORMAT$(NBRound( 01.250, 1)) + $CR + _
        FORMAT$(NBRound( 01.249, 1)) + $CR + _
        FORMAT$(NBRound( 01.248, 1))
 
    LOCAL llCount1 AS LONG
    LOCAL lnTimer AS SINGLE
    LOCAL lxTest1, lxTest2 AS EXT
    lxTest2 = 3.456
 
    lnTimer = TIMER
    FOR llCount1 = 999999 TO 0 STEP -1 '1 million ops = 0.35 seconds on 1.6GHz AMD laptop
        lxTest1 = NBRound(lxTest2, 2)
    NEXT llCount1
    lnTimer = TIMER - lnTimer
 
    ? FORMAT$(NBRound(lnTimer, 2)) + " seconds"
 
END FUNCTION