2015-11-02 996 views
2

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);

我不了解如何正确舍入?

回答

5

你正在被一个基本事实所咬。你想看精确的小数,但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了解更多。

+0

我希望我可以双倍投票给你! (特别是对于'精确'提示。)感谢您将二进制表示形式带回家。 :) – Alexis

+0

谢谢你。如果你感到慷慨,你可以找一个值得赞赏的帖子。 (但不能再更改;一个人的系列upvoting被自动检测并反转。) –