我想限制标签内的浮点数:
beginfig(1)
for i=1 upto 5:
label.bot(textext("$" & (decimal (-0.8*i)) & "$"), (-0.8*i, -0.2));
endfig;
end;
目前它在逗号后显示 5 个数字。我需要 2 个。
答案1
您可以定义一个 MetaPost 宏来选择正确的子字符串:
vardef tdecimal(expr num, d) :=
save numS; string numS; numS = decimal(num);
save j; j := length numS;
for k = 0 upto length numS - 1:
if "." == substring (k,k+1) of numS: j:=k; fi
endfor
for k = j + 1 upto j + d:
if "0" <> substring (k,k+1) of numS: j:=k+1; fi
endfor
substring (0,j) of numS
enddef;
然后您可以使用例如tdecimal(1.234567, 2)
来获取1.23
或tdecimal(1.234567, 3)
来获取1.234
。
更简单的替代方案是分别获取整数和小数部分的字符串表示,但这会导致 MetaPost 中的一些舍入问题。无论如何,如果你想尝试一下,代码将是
vardef twodecimal(expr num) :=
if num < 0:
"-" & decimal(floor(-num)) & "." & substring (1,3) of decimal(floor((-num-floor(-num)+1)*100))
else:
decimal(floor(num)) & "." & substring (1,3) of decimal(floor((num-floor(num)+1)*100))
fi
enddef;
答案2
添加\usepackage{xintfrac}
到序言(序言?我不记得元帖子术语了)并使用
label.bot(textext("$\xintRound{2}{" & (decimal (-0.8*i)) & "}$"), (-0.8*i, -0.2))
好吧,我完成了你的工作,并打开了 MetaPost 手册。我不知道你的“textext”是什么,它一定是由一些额外的宏提供的。
input TEX;
TEXPRE("\input xintfrac.sty\relax");
beginfig(1);
pickup pencircle scaled 1pt;
draw (0,0);
numeric i;
i := 1.236;
label.bot(TEX("$\xintTrunc{2}{" & (decimal (-0.8*i)) & "}$"), (-0.8*i, -0.2))
endfig;
end
当按照操作mpost
生成正确的 EPS 文件时。我使用了\xintTrunc
您想要的截断。这可以在没有任何包的情况下完成(截断比舍入更容易。)
我搜索了 MetaPost 手册中所有出现的“十进制”,但没有看到如何预先进行截断,但这一定是可能的,因为在参考文献中我看到“decNumber ANSI C 实现的一般十进制算术”。
答案3
这是“tdecimal”的另一个版本。欢迎任何改进。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vardef tdecimal(expr num, d) :=
save numS, k, j, jj, ep_, dp_ ;
numeric k, j, jj, ip_, dp_ ;
string numS ;
numS = decimal(num) ;
if (d <= 0) :
decimal(round(num))
else :
if (d <= 14) :
if (num >= 0) :
j := 1 ;
else :
j := -1 ;
fi ;
ip_ := abs(floor(num)) ;
dp_ := round((abs(num) - ip_)*(10**d))/((10**d)-0.1) ; % -0.1 : Pb d'arrondi de MP
numS := decimal(j*(ip_ + dp_)) ;
fi ;
% Position of '.'
j := -1 ;
jj := length(numS) ;
k := 0 ;
forever: exitunless (k <= jj - 1) ;
if "." = substring (k, k+1) of numS :
j := k ; % position of '.'
k := jj ; % to exit loop
fi ;
k := k + 1 ;
endfor
if j < 0 :
numS := numS & "." ;
j := jj ;
fi ;
for k = j + 1 upto j + d :
if (substring (k, k+1) of numS) = "" :
numS := numS & "0" ;
fi ;
endfor ;
substring (0, j+d+1) of numS
fi
enddef ;
%show tdecimal(3.141592, 4) ;
%show tdecimal(-3.141592, 4) ;