数字位数的标量格式化问题

Dim*_*rov 1 stata stata-macros

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

这是 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;
Run Code Online (Sandbox Code Playgroud)

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

The*_*ear 5

当您创建标量时,您会复制 local 的值 `my_x'。该值仍然92.23999999999999不变: display,不会更改基础数据,只会更改其显示方式。可以将其视为5.00e+2和中的数据500是相同的,只是该值的显示方式有所不同。

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

  1. 虽然标量通常可以保存字符串和数值,但返回的标量不能保存字符串(不要问我为什么)。可以换回当地人吗?

  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;
Run Code Online (Sandbox Code Playgroud)