PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rundungsfehler bei \pgfmathsetmacro



Thomas D
13-06-2018, 16:21
Hallo

Ich möchte eine LaTeX-Vorlage für Rechnungen verwenden. Ich habe dabei folgendes Minimalbeispiel verwendet.



\documentclass[11pt,ngerman]{article}
\usepackage{mathpazo}
\usepackage[T1]{fontenc}
\usepackage[latin9]{luainputenc}
\pagestyle{empty}

\makeatletter

\usepackage{pgf}
\usepackage{numprint}
\nprounddigits{2}

\makeatother

\usepackage{babel}
\begin{document}
\newcommand{\netto}{1700}
\newcommand{\steuersatz}{20}

\pgfmathsetmacro\brutto{(1+\steuersatz/100)*\netto}
\pgfmathsetmacro\ust{\brutto-\netto}

Summe Netto = \numprint{\netto} \\
Umsatzsteuer {\steuersatz} \% = \numprint{\ust} \\
Gesamt brutto = \textbf{\numprint{\brutto}} \\
\end{document}

Bei der Berechnung kommt es allerdings zu einem mir unerklärlichen Rundungsfehler. Wenn ich die obige Formel in einen Taschenrechner eintippe, kommt das erwartete Ergebnis von 2040 € brutto heraus. Bei der Berechnung mit \pgfmathsetmacro kommt allerdings stets 2039,99 € heraus. Wo könnte hier der Fehler liegen?

klops
13-06-2018, 16:46
Die normale Rechengenauigkeit von pgfmath ist eher mäßig. Es gibt dazu diverse Hinweis in der pgf-Anleitung beispielsweise in der Einleitung zur Fixed-Point-Arithmethic-Library aber auch in der Einleitung zur Math Library selbst.

Alternativ kann man Berechnungen auch in Lua durchführen (lualatex) vorausgesetzt.

luainputenc sollte man übrigens eher nicht verwenden. Das ist nur eine Notlösung für den Fall dass man keine vernünftigen Fonts hat und keine native utf8-Codierung verwenden kann. Das sollte die absolute Ausnahme sein! Und natürlich lässt man dann auch gleich das Paket fontenc weg und verwendet bei Bedarf fontspec zum Laden und Verwalten von Fonts.

u_fischer
13-06-2018, 17:05
Ich würde dafür entweder lua oder \fpeval vom xfp-Paket verwendet. Beide rechnen deutlich besser.

Thomas D
16-06-2018, 11:07
Vielen Dank für die Antwort. Ich habe \fpeval verwendet und nun ist die Berechnung, so wie man es sich vorstellt.


\FPset\netto{1700}
\FPset\steuersatz{20}

\FPeval\brutto{(1+\steuersatz/100)*\netto}
\FPeval\ust{\brutto-\netto}

u_fischer
16-06-2018, 15:47
\FPeval ist aus dem alten fp-Paket. Ich schrieb von \fpeval aus dem neuen xfp (das von expl3/interface3 kommt).