Module:Utils: Difference between revisions

+round_dec
Improve the algorithm of sigfig
Line 38: Line 38:
-- return x rounded to places decimal places
-- return x rounded to places decimal places
function p.round_dec(frame)
function p.round_dec(frame)
local args = get Args(frame)
local args = getArgs(frame)
return p._round_dec(args[1], args[2])
return p._round_dec(args[1], args[2])
end
end
Line 61: Line 61:
-- prec defaults to 6
-- prec defaults to 6
prec = p.eval_num_arg(prec, 6)
prec = p.eval_num_arg(prec, 6)
local s = string.format(string.format("%%.%df", prec), x)
return p._round_dec(x, prec - math.floor (p._log (math.abs (x), 10)) - 1)
-- remove non-significant digits
local sep_pos = s:find('%.')
local neg = s:find('%-') ~= nil
if neg then neg = 1 else neg = 0 end
if prec + neg >= sep_pos then
s = s:sub(1, prec + 1 + neg)
else
s = s:sub(1, prec + neg)
while #s < sep_pos - 1 do
s = s .. '0'
end
end
-- remove unnecessary zeros
if s:find('%.') then
while s:sub(-1) == '0' do
s = s:sub(1, -2)
end
-- remove unnecessary .
if s:sub(-1) == '.' then
s = s:sub(1, -2)
end
end
return s
end
end