Modul:Dec till frac

Från Wikipedia

Dokumentation [visa] [redigera] [historik] [rensa sidcachen]


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.."<sup>&nbsp;"..taljare.."</sup>⁄<sub>"..namnare.."</sub>"    

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