ROUNDMATH FunctionWindows/Unix


A math function that converts a number to an integer by rounding the fractional part of the expression.

Syntax: ROUND(numeric-expression)
A% = ROUND(3.49)   '-- Returns 3
A% = ROUND(3.50)   '-- Returns 4

Details:
 If the argument is  negative, then Round always rounds toward zero. I.E. Round(-3.99) returns -3 instead of -4. 
 Also IEEE choses round-to-even like this

-2.5 rounds to -2
-1.5 rounds to -2
-0.5 rounds to 0
 0.5 rounds to 0
 1.5 rounds to 2
 2.5 rounds to 2


If you need different precision then try one of these routines.

FUNCTION RoundOff(z AS DOUBLE , accuracy AS INTEGER) AS DOUBLE
    DEFDBL scaleracc = 10^accuracy
    IF z < 0 THEN
        RESULT = CEIL(z * scaleracc - 0.500000#) / scaleracc
    ELSE
        RESULT = FLOOR(z * scaleracc + 0.500000#) / scaleracc
    END IF
END FUNCTION

RoundOff(x, 0) for x:
-2.5 rounds to -3
-1.5 rounds to -2
-0.5 rounds to -1
 0.5 rounds to 1
 1.5 rounds to 2
 2.5 rounds to 3


'This version is IEEE binary round-to-even compatible:

FUNCTION rqROUND_TC(Value#) AS LONG
    DEFDBL ABSVal# = ABS(Value#)
    DEFINT SGNVal& = SGN(Value#)
    DEFINT FIXVal& = FIX(ABSVal#)
    DEFDBL FRACVal# = FRAC(ABSVal#)
    DEFINT AddVal& = (((FRACVal# = .5) AND FIXVal&) OR (FRACVal# > .5)) AND 1
    FIXVal& += AddVal&: IF SGNVal& = -1 THEN FIXVal& = -FIXVal&
    rqROUND = FIXVal&
END FUNCTION

' this is faster but still rounds to even
FUNCTION rqROUND2(Value AS DOUBLE) AS INTEGER
    IF Value < 0 THEN
        RESULT = -1 * ROUND(ABS(Value))
    ELSE
        RESULT = ROUND(Value)
     END IF
END FUNCTION