2015-11-02 55 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被自動檢測並反轉。) –