Stata看起来实际上并没有圆形()

时间:2015-11-02 19:38:09

标签: rounding stata

Stata具有x功能。可以选择它所围绕的单位。我想使用x将任意浮点值舍入到两个小数位。 Stata的round()似乎明白这一点。但不知何故,round(ArbitraryValue, 0.01)的内部表示仍然具有未定义的浮点值:

  

。当地LevelA = 99.98765432123321

     

。 ttest mpg == 20,level(`LevelA')
  level()在小数点后最多可以有两位数   R(198);

     

。本地LevelB = round(`LevelA',0.01)

     

。 di`B等B'   99.99

     

。 ttest mpg == 20,level(`LevelB')
  level()必须介于10和99.99之间   R(198);

     

设置跟踪      

。 ttest mpg == 20,level(`LevelB')

     

[SNIP]
  = local 0 mpg = 20,level( 99.99000000000001
  [SNIP]
  R(198);

我不了解如何正确舍入?

1 个答案:

答案 0 :(得分: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了解详情。