Simple Round

lua-users home
wiki

The following function rounds a number to the given number of decimal places.

function round(num, idp)
  local mult = 10^(idp or 0)
  return math.floor(num * mult + 0.5) / mult
end

Here is an alternative implementation:

function round2(num, idp)
  return tonumber(string.format("%." .. (idp or 0) .. "f", num))
end

Both are Lua 5.0 and 5.1 compatible.

Tests:

> function test(a, b) print(round(a,b), round2(a,b)) end
> test(43245325.9995, 3)
43245326        43245325.999
> test(43245325.9994, 3)
43245325.999    43245325.999
> test(43245325.5543654)
43245326        43245326
> test(43245325.5543654, 3)
43245325.554    43245325.554
> test(43245325.5543654, 4)
43245325.5544   43245325.5544

Note: The first function will misbehave if idp is negative, so this version might be more robust (Robert Jay Gould)


Actually i wanted it to round to 100s, so the negative cases are very useful and ok mathematically (no error there):

round(1023.4345, -2) = 1000
round(1023.4345, 2) = 1023.43
(Tom P.)
function round(num, idp)
  if idp and idp>0 then
    local mult = 10^idp
    return math.floor(num * mult + 0.5) / mult
  end
  return math.floor(num + 0.5)
end


function round(num) return math.floor(num+.5) end
-- Rob
FindPage · RecentChanges · preferences
edit · history
Last edited August 13, 2009 10:22 pm GMT (diff)