Stata貌似实际上并没有四舍五入()
Stata有一个round()
函数。人们可以选择它所围绕的单位。我想使用round(ArbitraryValue, 0.01)
将任意浮点值舍入到两位小数。 Stata的display
似乎明白这一点。但不知何故round(ArbitraryValue, 0.01)
的内部表示仍然具有未知的浮点值:Stata貌似实际上并没有四舍五入()
。本地LevelA = 99.98765432123321
。 ttest mpg == 20,level(`LevelA')
level()在小数点后最多可以有两位数
r(198);。本地LevelB = round(`LevelA',0.01)
。 di`LevelB'
99.99。 ttest mpg == 20,level(`LevelB')
level()必须介于10和99.99之间(包括在内)
r(198);。设置跟踪
。 t检验MPG == 20,电平(`水平b')
[SNIP]
=本地0英里= 20,电平(99.99000000000001)
[SNIP]
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
了解更多。
我希望我可以双倍投票给你! (特别是对于'精确'提示。)感谢您将二进制表示形式带回家。 :) – Alexis
谢谢你。如果你感到慷慨,你可以找一个值得赞赏的帖子。 (但不能再更改;一个人的系列upvoting被自动检测并反转。) –