Anzeige:
Ergebnis 1 bis 12 von 12

Thema: tex.round () mit LuaTeX: Zahl der Nachkommastellen

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.06.2005
    Ort
    Karlsruhe
    Beiträge
    1.407

    tex.round () mit LuaTeX: Zahl der Nachkommastellen

    Hallo,

    das schöne Beispiel von Herbert hier

    Code:
    \documentclass{article}
    
    \newcommand*\prozent[2]{\directlua{tex.print(#1/#2*100)}}
    
    \begin{document}
    
    \prozent{33}{117}
    
    \end{document}
    führt zu dem Ergebnis 28.2051... mit vielen Nachkommastellen.

    Nun würde ich das Ergebnis gerne runden auf zwei Nachkommastellen. Das geht einerseits mit dem Paket numprint und dem Befehl \nprounddigits{2}. Davon aber sind sämtliche Zahlen betroffen, die numprint anfasst.

    Führt tex.round() nur zu ganzen Zahlen?

    Schreibe ich im obigen Beispiel

    Code:
    \newcommand*\prozent[2]{\directlua{tex.print(tex.round(#1/#2*100))}}
    erhalte ich als Ergebnis "28", ich hätte aber eben gerne 28.21.

    Es kommt natürlich in Frage, statt mal 100 einfach mal 10000 zu nehmen und das Ergebnis wieder durch 100 zu teilen, also:

    Code:
    \newcommand*\prozent[2]{\directlua{tex.print(tex.round(#1/#2*10000)/100)}}
    mit dem gewünschten Ergebnis 28.21. Schon, aber bei Rechnungen, die glatt aufgehen, habe ich dann keine zwei Nachkommastellen und das sieht in Tabellen ganz schlecht aus.

    Ich hoffe, es war verständlich dargelegt, was ich will: tex.round() mitteilen, auf wieviele Nachkommastellen gerundet werden soll.

    Danke für Eure Hilfe!

    Alexander

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Ich denke (ich kann zumindest auf die schnelle keine "fertige" Funktion finden), du wirst eine geeignete Funktion definieren müssen. Das Internet spuckte das hier aus (aber ob es in allen Fällen das richtige ergibt, habe ich nicht überprüft):

    Code:
    \documentclass{article}
    
    \directlua{function round(what, precision)
    	        return math.floor(what*math.pow(10,precision)+0.5) / math.pow(10,precision)
             end}
    \newcommand*\prozent[2]{\directlua{tex.print(round(#1/#2*100,2))}}
    
    \begin{document}
    
    \prozent{33}{117}
    
    \end{document}

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.06.2005
    Ort
    Karlsruhe
    Beiträge
    1.407
    Du bist unglaublich. Vielen Dank. Ich werd's jetzt anhand der Lua-Anleitungen im Netz nachvollziehen.

    Wir können ja mal sammeln:

    http://lua.gts-stolberg.de/index.php

    http://wiki.siedler-aek.de/lua

    http://bladehunter.lima-city.de/lua/book/

    http://lua.lickert.net/


    Wer weiß noch ein paar?


    Gruß,
    Alexander

    Edit:

    Das Beispiel lässt sich also nun "vereinfachen" mit drei Parameter, der dritte ist jetzt die Anzahl der Nachkommastellen:

    Code:
    \documentclass{article}
    
    \directlua{function round(what, precision)
    	        return math.floor(what*math.pow(10,precision)+0.5) / math.pow(10,precision)
             end}
    \newcommand*\prozent[3]{\directlua{tex.print(round(#1/#2*100, #3))}}
    
    %\newcommand*\prozent[2]{\directlua{tex.print(tex.round(#1/#2*10000)/100)}}
    
    \begin{document}
    
    \prozent{33}{117}{3}
    
    \end{document}
    Geändert von cookie170 (16-12-2010 um 14:27 Uhr)

  4. #4
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von cookie170 Beitrag anzeigen

    führt zu dem Ergebnis 28.2051... mit vielen Nachkommastellen.

    Nun würde ich das Ergebnis gerne runden auf zwei Nachkommastellen. Das geht einerseits mit dem Paket numprint und dem Befehl \nprounddigits{2}. Davon aber sind sämtliche Zahlen betroffen, die numprint anfasst.
    das geht auch:
    Code:
    \documentclass{article}
    
    \newcommand*\prozent[2]{\directlua{tex.print(math.ceil(#1/#2*10000)/100)}}
    
    \begin{document}
    
    \prozent{33}{117}
    
    \end{document}

    Herbert

  5. #5
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von cookie170 Beitrag anzeigen
    Das Beispiel lässt sich also nun "vereinfachen" mit drei Parameter, der dritte ist jetzt die Anzahl der Nachkommastellen:
    Hier optional:
    Code:
    \documentclass{article}
    
    \newcommand*\prozent[3][3]{\directlua{%
      faktor=math.pow(10,#1);
      tex.print(math.floor(faktor*#2/#3*100)/faktor)}}
    
    \begin{document}
    
    \prozent{33}{117}
    
    \prozent[1]{33}{117}
    
    \prozent[7]{33}{117}
    
    \end{document}
    Herbert

  6. #6
    Registrierter Benutzer
    Registriert seit
    28.06.2005
    Ort
    Karlsruhe
    Beiträge
    1.407
    Hallo,

    ich bin jetzt nicht so schnell, sondern habe mir zuerst die beiden ersten Beispiele vorgenommen. Beide liefern ein falsches Ergebnis für

    Code:
    \prozent{1,855055}{5}
    Richtig wäre 37,10, Ulrikes erstes Beispiel liefert 37,1 -- es fehlt also eine Stelle und Herberts erstes Beispiel liefert 37,11 -- hier ist die letzte Kommastelle also zu hoch.

    Wenn ich richtig überlegt habe, nimmt man Mathe genau, ist's verdammt schwierig für mich.

    Gruß,
    Alexander

  7. #7
    Registrierter Benutzer
    Registriert seit
    28.06.2005
    Ort
    Karlsruhe
    Beiträge
    1.407
    Zitat Zitat von voss Beitrag anzeigen
    Hier optional:
    Code:
    \documentclass{article}
    
    \newcommand*\prozent[3][3]{\directlua{%
      faktor=math.pow(10,#1);
      tex.print(math.floor(faktor*#2/#3*100)/faktor)}}
    
    \begin{document}
    
    \prozent{33}{117}
    
    \prozent[1]{33}{117}
    
    \prozent[7]{33}{117}
    
    \end{document}
    Herbert
    Hallo Herbert,

    vielen Dank für Deine Mühe, das ist schlau ausgedacht, ich beginne so allmählich zu ahnen, wie mächtig die Kombination von LaTeX und Lua ist.

    In den Niederungen der Praxis entfällt dummerweise aber auch hier die letzte Stelle, wenn sie Null ist.

    Ich muss mir also überlegen, wie man abfragt, "wieviele Stellen hat das Ergebnis" und wenn die Antwort ist "kleiner der Summe aus Anzahl der Vorkommastellen plus Anzahl der gewünschten Nachkommastellen", dann müssen an das Ergebnis solange Nullen angefügt werden, bis es stimmt. Seufz.

    Gar nicht so einfach.

  8. #8
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Du willst das Ergebnis formatieren, dafür gibt es string.format. Hauptproblem ist, dass das Formatierungsargument Prozentzeichen benutzt, du musst daher entweder den Code in eine externe lua-Datei auslagern, oder luaexec aus dem luacode-Paket benutzen, damit \% funktioniert:

    Code:
    \documentclass{article}
    \usepackage{luacode}
    \newcommand*\prozent[3][3]{\luaexec{%
      faktor=math.pow(10,#1);
      tex.print(string.format("\%.2f",math.floor(faktor*#2/#3*100)/faktor))}}
    
    \begin{document}
    
    
    \prozent{33}{117}
    
    \prozent[1]{33}{117}
    
    \prozent[7]{33}{117}
    
    \end{document}

  9. #9
    Registrierter Benutzer
    Registriert seit
    28.06.2005
    Ort
    Karlsruhe
    Beiträge
    1.407
    Code:
    \documentclass{article}
    \usepackage{luacode}
    \newcommand*\prozent[3][3]{\luaexec{%
      faktor=math.pow(10,#1);
      tex.print(string.format("\%.#1f",math.floor(faktor*#2/#3*100)/faktor))}}
    
    \begin{document}
    
    
    \prozent{33}{117}
    
    \prozent[1]{33}{117}
    
    \prozent[7]{33}{117}
    
    \end{document}
    Eine Änderung habe ich eingefügt mit roter Markierung. Ich bin baff, was alles geht, aber die Doku des Befehls, die ich gefunden habe, lässt das nicht einmal erahnen.

    Herzlichen Dank nochmal an Ulrike und Herbert,

    Gruß,
    Alexander

    P.S: Ach ja, wenn jemand mit mathematischem Karma das hier liest und so leise bei sich denkt, dass der obige Code in irgendwelchen Fällen zu einem falschen Ergebnis führt, dann soll er oder sie das hier anmerken.


    EDIT:

    string.format rundet nicht, sonder lässt einfach die nicht gewünschten Ziffern weg. Ups. Ich muss das wohl mal ausführlicher testen.
    Geändert von cookie170 (16-12-2010 um 18:09 Uhr)

  10. #10
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von u_fischer Beitrag anzeigen
    Du willst das Ergebnis formatieren, dafür gibt es string.format. Hauptproblem ist, dass das Formatierungsargument Prozentzeichen benutzt, du musst daher entweder den Code in eine externe lua-Datei auslagern, oder luaexec aus dem luacode-Paket benutzen, damit \% funktioniert:
    man kann es auch maskieren:

    Code:
    \makeatletter
    \newcommand*\prozent[3][3]{\directlua{%
      faktor=math.pow(10,#1);
      tex.print(string.format("\@percentchar.2f",math.floor(faktor*#2/#3*100)/faktor))}}
    \makeatother
    Herbert

  11. #11
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von cookie170 Beitrag anzeigen
    string.format rundet nicht, sonder lässt einfach die nicht gewünschten Ziffern weg. Ups. Ich muss das wohl mal ausführlicher testen.
    es gibt unter Lua nur ceil und floor mit den gleichen Eigenschaften wie unter
    PostScript. Round und trunc müsste man sich selbst schreiben, was allerdings
    kein Problem ist.

    Herbert

  12. #12
    Registrierter Benutzer
    Registriert seit
    28.06.2005
    Ort
    Karlsruhe
    Beiträge
    1.407
    Es scheint so zu funktionieren:

    Code:
    \documentclass{article}
    
    
    \usepackage{luacode}
    \newcommand*\prozent[3][3]{\luaexec{%
      faktor=math.pow(10,#1);
      tex.print(string.format("\%.#1f",math.floor(faktor*#2/#3*100+0.5)/faktor))}}
    
    
    \begin{document}
    
    \prozent[6]{1.855055}{5}
    
    \prozent[2]{33}{117}
    
    \prozent[0]{33}{117}
    
    \prozent[1]{33}{117}
    
    \prozent[5]{33}{117}
    
    
    \end{document}
    Ich werd's in einem ruhigen Moment überdenken.

    A.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •