四舍五入到小数点后一位的问题...

四舍五入到小数点后一位的问题...

我对舍入有疑问---我已经看到如何让 \pgfmathparse 创建四舍五入到小数点后一位的值?但我仍然无法获得我需要的结果。

请参阅此 MWE:

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pgf}
\usepackage{calc}
\usepackage{lmodern}
\usepackage{venturis}
\usepackage{librebaskerville}

\newlength\caph\newlength\xlen%
\newcommand*{\prlen}[1]{%
   % round to 1 digit:
    \pgfmathparse{round(10*#1)/10.0}%
    \pgfkeys{/pgf/number format/precision=1}
    \pgfmathresult
   % \pgfmathprintnumber[fixed, precision=1]{\pgfmathresult}
}
%
\newcommand{\showlengths}{%
\setlength{\caph}{\heightof{A}}%
\setlength{\xlen}{1ex}%
{\ttfamily
Caph: \prlen{\caph} \the\caph \par
X-He: \prlen{\xlen} \the\xlen \par
\medskip
}
}

\begin{document}

\librebaskerville\fontsize{100pt}{120pt}\selectfont
\showlengths

\fontfamily{yvtj}\fontsize{100pt}{120pt}\selectfont
\showlengths

\fontfamily{yvtd}\fontsize{100pt}{120pt}\selectfont
\showlengths

\fontfamily{lmr}\fontsize{100pt}{120pt}\selectfont
\showlengths

\end{document}

结果是:

输出

...有时你会发现十除法的精度损失让我很头疼。如果我将 的定义改为\prlen使用\pgfmathprintnumber,如下所示:

\newcommand*{\prlen}[1]{%
   % round to 1 digit:
    \pgfmathparse{round(10*#1)/10.0}%
    %\pgfkeys{/pgf/number format/precision=1}
    %\pgfmathresult
    \pgfmathprintnumber[fixed, precision=1]{\pgfmathresult}
}

我有这个,它用数学字体打印东西:

新输出

有没有办法进行正确的舍入,但使用我在外面使用的正常字体,就像第一种情况一样?

答案1

\pgfmathprintnumber为此使用数学模式。

我建议改变的定义\prlen

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\prlen}{m}
 {
  \fp_eval:n { round(\dim_to_fp:n { #1 }, 1) }
 }
\ExplSyntaxOff

在此处输入图片描述

如果你想要一位小数,即使是零,你也可以这样做

\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand{\prlen}{m}{%
  \num[
    detect-all,
    round-integer-to-decimal,
    round-mode=places,
    round-precision=1,
  ]{\fp_eval:n { \dim_to_fp:n #1 }}
}
\ExplSyntaxOff

在此处输入图片描述

相关内容