具有位数的标量格式化问题

Scalar formatting problem with number of digits

我正在尝试编写一个命令来返回一个百分比四舍五入到小数点后两位的标量。百分比可负可正,小数点前位数未知。

这是显示我遇到的问题的 MRE。

#delimit;

capture program drop my_note;
program my_note, eclass;
    local my_x: display %-9.2f 92.23999999999999;
    ereturn scalar my_x = `my_x';
end;

ereturn clear;
my_note;
ereturn list;

display %-9.2f 92.23999999999999;
display 92.23999999999999;

我很困惑为什么显示似乎做正确的事情(将 92.23999999999999 转换为 92.24,尽管不管格式如何),但 e(my_x) 似乎没有继承该格式。

创建标量时,您会复制本地 `my_x' 的值。该值仍然是 92.23999999999999,因为 : display 不会改变基础数据,只会改变它的显示方式。将其视为 5.00e+2500 中的数据相同,只是该值的显示方式不同。

您需要使用字符串来处理值的显示方式。但是,您的代码示例中的字符串存在两个问题。

  1. 虽然标量通常可以保存字符串和数值,但 returned 标量不能保存字符串(不要问我为什么)。可以 return 本地人代替吗?

  2. %-9.2f 中,您将显示格式指定为 9 个字符长,因此您的标量将为 e(my_x) : "92.24 "。您可以调整 %-9.2f,但由于您现在正在处理字符串,因此您可以使用 trim() 函数删除过多的空格。

尝试下面的代码,看看在给定此函数的上下文的情况下是否有效。如果没有,请告诉我们更多关于您将要做什么的信息。

#delimit;

capture program drop my_note;
program my_note, eclass;
    local my_x: display %-9.2f 92.23999999999999;
    ereturn local my_x = trim("`my_x'");
end;

ereturn clear;
my_note;
ereturn list;