PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tex.round () mit LuaTeX: Zahl der Nachkommastellen



cookie170
16-12-2010, 13:01
Hallo,

das schöne Beispiel von Herbert hier


\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


\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:


\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

u_fischer
16-12-2010, 13:35
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):


\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}

cookie170
16-12-2010, 14:58
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:


\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}

voss
16-12-2010, 15:09
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:

\documentclass{article}

\newcommand*\prozent[2]{\directlua{tex.print(math.ceil(#1/#2*10000)/100)}}

\begin{document}

\prozent{33}{117}

\end{document}


Herbert

voss
16-12-2010, 15:58
Das Beispiel lässt sich also nun "vereinfachen" mit drei Parameter, der dritte ist jetzt die Anzahl der Nachkommastellen:


Hier optional:

\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

cookie170
16-12-2010, 16:15
Hallo,

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


\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

cookie170
16-12-2010, 16:35
Hier optional:

\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.

u_fischer
16-12-2010, 16:58
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:


\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}

cookie170
16-12-2010, 18:59
\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.

voss
16-12-2010, 19:28
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:


\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

voss
16-12-2010, 19:30
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

cookie170
17-12-2010, 15:17
Es scheint so zu funktionieren:


\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.