HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

RoundTo

07-19-2010, 10:47 AM#1
WaterKnight
Rounds a real to the closest integer multiple of another real.

Code:
function RoundTo takes real base, real interval returns real
    local real a
    local real b
    local real baseSign = RSignBJ(base)
    local integer period

    if (interval == 0.) then
        return 0.
    endif

    if (interval < 0.) then
        set interval = -interval
    endif

    set base = baseSign * base
    set period = R2I(base / interval)

    set a = period * interval
    set b = (period + 1) * interval

    if (base - a < b - base) then
        return (baseSign * a)
    endif

    return (baseSign * b)
endfunction
07-19-2010, 11:29 AM#2
Anitarf
How about this:
Collapse JASS:
function RoundTo takes real base, real interval returns real
    if interval==0.0 then
        return 0.0
    endif
    set base=base/interval
    if base<0.0 then
        return R2I(base-0.5)*interval
    endif
    return R2I(base+0.5)*interval
endfunction
or...
Collapse JASS:
function RoundTo takes real base, real interval returns real
    if interval==0.0 then
        return 0.0
    elseif base*interval<0.0 then
        return R2I(base/interval-0.5)*interval
    endif
        return R2I(base/interval+0.5)*interval
endfunction
07-19-2010, 11:54 AM#3
WaterKnight
Works too, I guess. Did not think of the shifted truncate functionality of R2I with 0.5.