2015-09-06 74 views
2

我想圓在Stata一個數字:Stata:回合不正確?

display round(1.015, .01) 

這將產生1.01而不是預期的1.02

至少這是我所期望的(認識到了我的預期可能無法符合一些Stata正在使用的標準)。

有關如何使Stata符合我的期望的任何建議?

+4

嘗試'顯示%23.18f 1.015'地看到,1.015不能精確這樣保持;你所報告的是一個副作用。 Stata中的「搜索精度」進行了非常多的討論。 –

回答

8

Stata使用數字的雙重或浮點表示(即基數2不是基數10)。不幸的是,1.015在基數2中不能表示,所以它會達到最接近的值,在這種情況下,它會略低於1.015,所以輪次就會下降。這是一個常見的問題與浮點精度的計算機上打交道時 - 例如見紅寶石這樣一個問題:Ruby Float#round method behaves incorrectly with round(2)

那麼如何解決這個問題?

如果3位小數的精度對您很重要,您需要使用定點精度。我不相信塔塔本身支持這一點,但它是很容易做到這一點吧:

display round(1015, 10)*0.001 

即你輸入號碼來獲得10^3倍,和你顯示的數字得到了10^-3倍。所有的處理因此在小數位你感興趣的數量與整數精度進行。

注意,但是,表面上看似乎等價display round(1.015*1000, 0.01*1000)*0.001的工作,因爲基2四捨五入將已經發生在閱讀「1.015」時(即計算機會看到1.01499999 ... * 1000 = 1014.999 ...)。當然,這也適用於從其他位置獲取值1.015的情況,例如用戶輸入或讀取文件。另外,Stata在其舍入模式(也稱爲打破平局)中似乎很安靜。雖然這是可能它使用的關係式,也有可能是關係到偶數或其他選項 - 這是最好不要依靠精確中途的行爲,除非你能找到它的明確的規範。