Stata 位数的标量格式问题

Stata 位数的标量格式问题,stata,stata-macros,Stata,Stata Macros,我正在尝试编写一个命令,该命令将百分比舍入到小数点后2位。百分比可以是负数或正数,小数点前的位数未知 这里的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; eretu

我正在尝试编写一个命令,该命令将百分比舍入到小数点后2位。百分比可以是负数或正数,小数点前的位数未知

这里的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.239999999999变为92.24,尽管不考虑格式),但e(my_x)似乎并没有继承该格式。

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

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

  • 虽然标量通常可以同时保存字符串和数值,但返回的标量不能保存字符串(不要问我为什么)。有没有可能换成本地的

  • %-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;
    

    创建标量时,复制
    `my_x'
    的值,该值仍然是
    92.239999999999
    ,因为
    :display
    不会更改基础数据,只更改其显示方式。将其视为
    5.00e+2
    500
    中的数据是相同的,只是该值的显示方式不同

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

  • 虽然标量通常可以同时保存字符串和数值,但返回的标量不能保存字符串(不要问我为什么)。有没有可能换成本地的

  • %-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;
    

    正如您所知,每个变量都有一个可以更改的显示格式。格式在很大程度上是变量的属性。当您在本地宏上使用显示格式时,本地宏既看不到也不记得该格式:它是宏的内容,一旦计算完毕,就会显示出来。您可以选择返回一个包含格式化内容的本地宏、一个字符串标量同上,以及一个按需显示的数字标量。@NickCox是正确的。变量的格式化和舍入是两件独立的事情。正如您所知,每个变量都有一个显示格式,您可以对其进行更改。格式在很大程度上是变量的属性。当您在本地宏上使用显示格式时,本地宏既看不到也不记得该格式:它是宏的内容,一旦计算完毕,就会显示出来。您可以选择返回一个包含格式化内容的本地宏、一个字符串标量同上,以及一个按需显示的数字标量。@NickCox是正确的。对变量进行格式化和舍入是两件独立的事情。