3

我目前正在使用此功能进行舍入:

function round(val, decimal)
  if (decimal) then
    return math.floor( (val * 10^decimal) + 0.5) / (10^decimal)
  else
    return math.floor(val+0.5)
  end
end

该功能完美运行,除了当一个数字落在 0.5 上时,如 5.5 或 1000.5 或 7.5,我需要它向下舍入而不是向上舍入。为了实现这一点,我必须对函数进行哪些更改?

4

2 回答 2

7
function round(val, decimal)
  local exp = decimal and 10^decimal or 1
  return math.ceil(val * exp - 0.5) / exp
end
于 2013-04-16T12:16:32.783 回答
2
function round(val, decimal)
  local rndval = math.floor(val)
  local decval = val - rndval
  if decimal and decimal ~= 0 then
    decval = decval * 10 ^ decimal
    return rndval + (decval % 1 > 0.5 and math.ceil(decval) or math.floor(decval)) / 10 ^ decimal
  else
    return decval > 0.5 and rndval + 1 or rndval 
  end
end

我的懒惰。无法访问解释器来测试它,但应该没问题。不知道,如果性能还可以...

编辑:在 LuaJIT 上,对该函数的 10 亿次调用大约需要半秒。在普通 Lua 上,它是每半秒 100 万次(Core i7/3610 移动版)。

于 2013-04-16T11:59:35.270 回答