Rebol Programming/round

= USAGE: = ROUND n /even /down /half-down /floor /ceiling /half-ceiling /to scale

= DESCRIPTION: = Returns the nearest integer. Halves round up (away from zero) by default.

ROUND is a function value. = ARGUMENTS =
 * n -- The value to round (Type: number money time)

= REFINEMENTS =
 * /even -- Halves round toward even results
 * /down -- Round toward zero, ignoring discarded digits. (truncate)
 * /half-down -- Halves round toward zero
 * /floor -- Round in negative direction
 * /ceiling -- Round in positive direction
 * /half-ceiling -- Halves round in positive direction
 * /to -- Return the nearest multiple of the scale parameter
 * scale -- Must be a non-zero value (Type: number money time)

= (SPECIAL ATTRIBUTES) =
 * catch

= SOURCE CODE = round: func [ {Returns the nearest integer. Halves round up (away from zero) by default.} [catch] n [number! money! time!] "The value to round" /even "Halves round toward even results" /down {Round toward zero, ignoring discarded digits. (truncate)} /half-down "Halves round toward zero" /floor "Round in negative direction" /ceiling "Round in positive direction" /half-ceiling "Halves round in positive direction" /to "Return the nearest multiple of the scale parameter" scale [number! money! time!] "Must be a non-zero value" /local m ][ throw-on-error [ scale: abs any [scale 1] any [number? n scale: make n scale] make scale either any [even half-ceiling] [ m: 0.5 * scale + n            any [ all [ m = m: m - mod m scale even positive? m - n                    m - mod m scale + scale ]                m            ] ] [           any [ floor ceiling (ceiling: (found? half-down) xor negative? n down) n: add n scale * pick [-0.5 0.5] ceiling ]            either ceiling [n + mod negate n scale] [n - mod n scale] ]   ] ]