Stata 似乎实际上并没有用 round() 四舍五入
Stata seemingly not actually rounding with round()
Stata 有一个 round()
函数。可以 select 它四舍五入的单位。我想使用 round(ArbitraryValue, 0.01)
将任意浮点值四舍五入到小数点后两位。 Stata 的 display
似乎理解这一点。但不知何故 round(ArbitraryValue, 0.01)
的内部表示仍然具有未舍入的浮点值:
. local LevelA = 99.98765432123321
. ttest mpg==20, level(`LevelA') <BR>
level() can have at most two digits after the decimal point <BR>
r(198);
. local LevelB = round(`LevelA',0.01)
. di `LevelB' <BR>
99.99
. ttest mpg==20, level(`LevelB') <BR>
level() must be between 10 and 99.99 inclusive <BR>
r(198);
. set trace on
. ttest mpg==20, level(`LevelB') <BR>
[SNIP]<BR>
= local 0 mpg = 20, level(**99.99000000000001**) <BR>
[SNIP] <BR>
r(198);
我对如何正确舍入有什么不理解的?
您被一个基本事实所困扰。你想看到精确的小数,但 Stata 在这里不使用精确的小数;它必须以二进制计算。大多数时候,在多个层面上的许多独创性会向你隐藏这一点,但偶尔它会突破到表面。
round()
不可能找到 99.99 的精确二进制表示,因为没有。这同样适用于 0.1(0.1)0.9 的任何倍数或分数,但 0.5 的某些倍数或分数除外。
从这个意义上说,只有在特殊情况下 round()
才能如您所愿,产生 0.01 的精确倍数。
由display
引起的计算不是这一原则的例外;只是默认显示格式通常会向您隐藏丑陋的事实。
你想要的实际上是一个字符串操作,即 display
具有指定的格式,例如 %3.2f
这将保证 Stata 认为它看到两位小数。
. sysuse auto, clear
(1978 Automobile Data)
. local LevelA = 99.98765432123321
. local myLevelA : di %3.2f `LevelA'
. ttest mpg == 20, level(`mylevelA')
One-sample t test
------------------------------------------------------------------------------
Variable | Obs Mean Std. Err. Std. Dev. [95% Conf. Interval]
---------+--------------------------------------------------------------------
mpg | 74 21.2973 .6725511 5.785503 19.9569 22.63769
------------------------------------------------------------------------------
mean = mean(mpg) t = 1.9289
Ho: mean = 20 degrees of freedom = 73
Ha: mean < 20 Ha: mean != 20 Ha: mean > 20
Pr(T < t) = 0.9712 Pr(|T| > |t|) = 0.0576 Pr(T > t) = 0.0288
search precision
了解更多。
Stata 有一个 round()
函数。可以 select 它四舍五入的单位。我想使用 round(ArbitraryValue, 0.01)
将任意浮点值四舍五入到小数点后两位。 Stata 的 display
似乎理解这一点。但不知何故 round(ArbitraryValue, 0.01)
的内部表示仍然具有未舍入的浮点值:
. local LevelA = 99.98765432123321
. ttest mpg==20, level(`LevelA') <BR>
level() can have at most two digits after the decimal point <BR>
r(198);
. local LevelB = round(`LevelA',0.01)
. di `LevelB' <BR>
99.99
. ttest mpg==20, level(`LevelB') <BR>
level() must be between 10 and 99.99 inclusive <BR>
r(198);
. set trace on
. ttest mpg==20, level(`LevelB') <BR>
[SNIP]<BR>
= local 0 mpg = 20, level(**99.99000000000001**) <BR>
[SNIP] <BR>
r(198);
我对如何正确舍入有什么不理解的?
您被一个基本事实所困扰。你想看到精确的小数,但 Stata 在这里不使用精确的小数;它必须以二进制计算。大多数时候,在多个层面上的许多独创性会向你隐藏这一点,但偶尔它会突破到表面。
round()
不可能找到 99.99 的精确二进制表示,因为没有。这同样适用于 0.1(0.1)0.9 的任何倍数或分数,但 0.5 的某些倍数或分数除外。
从这个意义上说,只有在特殊情况下 round()
才能如您所愿,产生 0.01 的精确倍数。
由display
引起的计算不是这一原则的例外;只是默认显示格式通常会向您隐藏丑陋的事实。
你想要的实际上是一个字符串操作,即 display
具有指定的格式,例如 %3.2f
这将保证 Stata 认为它看到两位小数。
. sysuse auto, clear
(1978 Automobile Data)
. local LevelA = 99.98765432123321
. local myLevelA : di %3.2f `LevelA'
. ttest mpg == 20, level(`mylevelA')
One-sample t test
------------------------------------------------------------------------------
Variable | Obs Mean Std. Err. Std. Dev. [95% Conf. Interval]
---------+--------------------------------------------------------------------
mpg | 74 21.2973 .6725511 5.785503 19.9569 22.63769
------------------------------------------------------------------------------
mean = mean(mpg) t = 1.9289
Ho: mean = 20 degrees of freedom = 73
Ha: mean < 20 Ha: mean != 20 Ha: mean > 20
Pr(T < t) = 0.9712 Pr(|T| > |t|) = 0.0576 Pr(T > t) = 0.0288
search precision
了解更多。