我需要一些与 floor() 对应的东西以便在宏中使用它(我不是指符号,我实际上是指向下舍入的函数)。
像这样:
\floor{34.75}
生产34
有人有主意吗?
答案1
使用 的浮点模块expl3
;它还可以接受非常自然形式的表达式,甚至是科学格式。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\floor}{m}
{
\fp_eval:n { floor ( #1 ) }
}
\ExplSyntaxOff
\begin{document}
$\floor{34.75}$
$\floor{-1.25}$
$\floor{2}$
$\floor{-1}$
$\floor{.3}$
$\floor{-.2}$
$\floor{7/3}$
$\floor{1e2/31}$
$\floor{-1000/333}$
$\floor{1000/333-1/332}$
$\floor{5*12/(2+9)}$
\end{document}
请注意,这是完全可扩展的,因此它甚至可以进入\edef
。我用$...$
它来避免减号问题。
答案2
您也可以使用pgf
数学。因为这是pgf
可以评估的各种数学表达式:
笔记:
- 和这里的其他答案
floor{-1}
之间存在差异,我认为这是一个错误?pgf
代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\newcommand{\Floor}[1]{%
\pgfmathparse{int(floor(#1))}%
\text{Floor} (#1)=\pgfmathresult%
}%
\begin{document}
$\Floor{34.75}$
$\Floor{-1.25}$
$\Floor{2}$
$\Floor{-1}$
$\Floor{.3}$
$\Floor{-.2}$
$\Floor{7/3}$
$\Floor{1e2/31}$
$\Floor{-1000/333}$
$\Floor{1000/333-1/332}$
$\Floor{5*12/(2+9)}$
\medskip
$\Floor{sin(90)}$
$\Floor{sin(-75)}$
$\Floor{cos(90)}$
$\Floor{cos(200)}$
\end{document}
答案3
来晚了,这里有一个基于 Lua 的方法。可能有点过头了,但嘿,这很有趣。:)
\documentclass{article}
\usepackage{luacode}
\newcommand\floor[1]{\luadirect{tex.print(math.floor(#1))}}
\begin{document}
$\floor{34.75}$
$\floor{-1.25}$
$\floor{2}$
$\floor{-1}$
$\floor{.3}$
$\floor{-.2}$
$\floor{7/3}$
$\floor{1e2/31}$
$\floor{-1000/333}$
$\floor{1000/333-1/332}$
$\floor{5*12/(2+9)}$
\end{document}
代码借自 egreg:)
答案4
使用\xintFloor
命令xintfrac
包裹。
它是完全可扩展的,因此甚至可以用于
\edef
需要可扩展性的其他环境。它本身接受分数作为
1000/333
输入,以及科学计数法,例如1.234e2
;如果您需要涉及中缀运算的更一般的输入,则可以使用floor
包提供的函数xintexpr
。还要注意,输入的大小不受限制,例如
\xintFloor {100000000000000000000000/100000000000000000000001}
确实提供了正确的值
0
,而不是1
由于分子和分母被截断为精度较低的近似值而导致的。您还可以考虑:\xinttheexpr floor (100+3828/9007+3752/9005-3376/9003-4201/9002)\relax
正确结果是
99
,而不是100
。或者\xinttheexpr floor(1+600001/900002+450002/900003-150001/900005)\relax
正确找到
1
并且不2
。
例子
\documentclass{article}
\usepackage{xintfrac}
\begin{document}
$\xintFloor{34.75}$,
$\xintFloor{-1.25}$,
$\xintFloor{2}$,
$\xintFloor{-1}$,
$\xintFloor{.3}$,
$\xintFloor{-.2}$
and also
$\xintFloor{7/3}$,
$\xintFloor{1e2/31}$,
$\xintFloor{-1000/333}$, and
$\xintFloor {100000000000000000000000/100000000000000000000001}$.
\end{document}
并且通过\usepackage{xintexpr}
可以做如下事情:
\xinttheexpr floor(1000/333-1/332)\relax
相关:\xintCeil
或-essionsceil
中的功能\xintexpr
。
还相关:\xintTFrac
和 frac
函数,它们提取小数部分。