\FPeval 语法错误 trunc 和 round

\FPeval 语法错误 trunc 和 round
    \total

\FPeval{\q}{clip(100*trunc(\total :0))}

\q  \\

\FPeval{\total}{clip(100*\total)}

\total \\

\FPeval{\q1}{clip(\total -\q)}

\q1

输出

1259.86
125900
125986
861      %the out put corret is 86

答案1

这行\FPeval{\q1}{clip(\total -\q)}语法不正确;你试图定义一个名为的变量\q1,但 TeX 坚决不同意,因为控制序列仅由

  • 单个非字母,或
  • 一系列字母。

名称\q1不符合要求。从实现上讲,您不会得到任何错误,但该行本质上相当于

\FPeval{\q}{clip(\total -\q)}

下面\q1打印的值\q,即86,然后打印1。

使用不同的名称:

\documentclass{article}
\usepackage[nomessages]{fp}

\begin{document}

\FPeval{\total}{1259.86}

\total

\FPeval{\q}{clip(100*trunc(\total :0))}

\q

\FPeval{\total}{clip(100*\total)}

\total

\FPeval{\qone}{clip(\total -\q)}

\qone

\end{document}

实际上,你可以将计算的最终结果保存在字符串中。例如,

\documentclass{article}
\usepackage[nomessages]{fp}

\begin{document}

\FPeval{\total}{1259.86}

\total

\FPeval{\q}{clip(100*trunc(\total :0))}

\q

\FPeval{\total}{clip(100*\total)}

\total

\FPeval{q1}{clip(\total -\q)}

\FPprint{q1}

\end{document}

可以。实际上,不推荐这种做法:据我所知,手册中甚至没有提到它。

expl3这是使用其强大的浮点模块的不同方法。

\documentclass{article}
\usepackage{xparse}
\usepackage{fmtcount}

\ExplSyntaxOn
\NewDocumentCommand{\spellnumber}{m}
 {
  \numberstringnum { \pokefaker_part_i:n { #1 } }
  \tl_if_empty:eF { \pokefaker_part_f:n { #1 } }
   {
    \c_space_tl point \c_space_tl
    \numberstringnum { \pokefaker_part_f:n { #1 } }
   }
 }

\NewExpandableDocumentCommand{\IPart}{m}
 {
  \pokefaker_part_i:n { #1 }
 }
\NewExpandableDocumentCommand{\FPart}{m}
 {
  \pokefaker_part_f:n { #1 }
 }

\cs_generate_variant:Nn \tl_range:nnn { e }
\prg_generate_conditional_variant:Nnn \tl_if_empty:n { e } { T,F,TF,p }

\cs_new:Nn \pokefaker_part_i:n
 {
  \fp_eval:n { floor(#1) }
 }
\cs_new:Nn \pokefaker_part_f:n
 {
  \tl_range:enn { \fp_eval:n { #1 - floor(#1) } } { 3 } { -1 }
 }
\ExplSyntaxOff

\begin{document}

\IPart{1259.86}

\FPart{1259.86}

\spellnumber{1259.86}

\spellnumber{2*(596.48+33.45)}

\end{document}

在此处输入图片描述

您不必事先知道小数位数。\tl_range:nnn我们可以提取从第三个到最后一个字符;0.如果整数部分为零,则始终返回一个带前导的浮点数。我检查结果字符串是否为空,并在其非空的情况下输出小数部分;如果计算结果中缺少小数部分,则不打印任何内容。

的参数\spellnumber\IPart\FPart可以是“fp 表达式”。例如\spellnumber{round(pi)}将打印“三点十四”。

这可以扩展以处理负数。

将其本地化为不同的语言并不困难。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[italian,spanish]{babel}
\usepackage{xparse}
\usepackage{fmtcount}

\providecommand{\decimalseparatorword}{point}
\addto\captionsitalian{\renewcommand{\decimalseparatorword}{virgola}}
\addto\captionsspanish{\renewcommand{\decimalseparatorword}{coma}}

\ExplSyntaxOn
\NewDocumentCommand{\spellnumber}{m}
 {
  \numberstringnum { \pokefaker_part_i:n { #1 } }
  \tl_if_empty:eF { \pokefaker_part_f:n { #1 } }
   {
    \c_space_tl \decimalseparatorword \c_space_tl
    \numberstringnum { \pokefaker_part_f:n { #1 } }
   }
 }

\NewExpandableDocumentCommand{\IPart}{m}
 {
  \pokefaker_part_i:n { #1 }
 }
\NewExpandableDocumentCommand{\FPart}{m}
 {
  \pokefaker_part_f:n { #1 }
 }

\cs_generate_variant:Nn \tl_range:nnn { e }
\prg_generate_conditional_variant:Nnn \tl_if_empty:n { e } { T,F,TF,p }

\cs_new:Nn \pokefaker_part_i:n
 {
  \fp_eval:n { floor(#1) }
 }
\cs_new:Nn \pokefaker_part_f:n
 {
  \tl_range:enn { \fp_eval:n { #1 - floor(#1) } } { 3 } { -1 }
 }
\ExplSyntaxOff

\begin{document}

\IPart{1259.86}

\FPart{1259.86}

\spellnumber{1259.86}

\spellnumber{2*(596.48+33.45)}

\selectlanguage{italian}

\IPart{1259.86}

\FPart{1259.86}

\spellnumber{1259.86}

\spellnumber{2*(596.48+33.45)}

\end{document}

在此处输入图片描述

相关内容