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);
我不了解如何正确舍入?
答案 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
了解详情。