Modul:Dec till frac

Från Järnvägsdata

local p = {}

function p.dec_till_frac(frame) -- Funktion: Översätter decimaltal till bråk i blandad form -- Parametrar: -- decimaltal - Talet som ska översättas, kan vara positivt eller negativt -- noggrannhet - Anger en övre gräns för nämnaren i bråket. Bråket avkortas om möjligt -- Resultat: Teckensträng, t ex 2 3/4, med täljare upphöjd och nämnare nedsänkt

 local decimaltal = frame.args.decimaltal+0
 local noggrannhet = frame.args.noggrannhet+0
 local absoluttal = math.abs(decimaltal)
 local decimaldel = absoluttal - math.floor(absoluttal)
 local tecken = ""
 if decimaltal < 0 and math.floor(absoluttal) ~= 0 then tecken = "-"; end
 
 if round(decimaldel * noggrannhet) == 0 then return tecken..math.floor(absoluttal); end
 if round(decimaldel * noggrannhet) == noggrannhet then return tecken..(math.floor(absoluttal) + 1); end
 if decimaltal < 0 then tecken = "-"; end
 local delare = sgd(noggrannhet, round(decimaldel * noggrannhet))
 local namnare = noggrannhet
 local taljare = round(decimaldel * namnare)
 if delare > 0 then namnare = namnare / delare; taljare = taljare / delare; end

 local heltalsdel = "" 
 if math.floor(absoluttal) > 0 then heltalsdel = ""..math.floor(absoluttal); end
 return tecken..heltalsdel.." "..taljare..""..namnare..""    

end

function round (x) -- Funktion: Avrundar parametern till närmaste heltal

 if x >= 0 then return math.floor (x + 0.5) else return math.ceil (x - 0.5) end

end

function sgd(a,b) -- a ska vara större eller lika med b -- Funktion: Beräknar största gemensamma delare till de två parametrarna while b > 0 do c = a % b; a = b ; b = c; end

 return a

end

return p