A5C*_*2T1 59
这不是我自己的功能,不幸的是,我目前无法找到我在哪里获得它(最初是在Statistically Significant博客上发现的匿名评论),但它应该有助于你需要的东西.
round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5
  z = trunc(z)
  z = z/10^n
  z*posneg
}
x是要n舍入的对象,是要舍入的位数.
一个例子
x = c(1.85, 1.54, 1.65, 1.85, 1.84)
round(x, 1)
# [1] 1.8 1.5 1.6 1.8 1.8
round2(x, 1)
# [1] 1.9 1.5 1.7 1.9 1.8
flo*_*del 33
如果你想要的东西的行为与round那些xxx.5值完全相同,试试这个:
x <- seq(0, 1, 0.1)
x
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
floor(0.5 + x)
# [1] 0 0 0 0 0 1 1 1 1 1 1
正如@CarlWitthoft在评论中所说,这是IEC 60559标准,如下所述?round:
注意,为了四舍五入,预计将使用IEC 60559标准,"转到偶数位".因此,round(0.5)为0,round(-1.5)为-2.但是,这取决于OS服务和表示错误(因为例如0.15没有准确表示,舍入规则适用于所表示的数字而不是打印数字,因此舍入(0.15,1)可以是0.1或0.2 ).
Greg Snow 的另一个解释:
圆均匀规则背后的逻辑是我们试图表示一个潜在的连续值,如果x来自一个真正连续的分布,那么x == 2.5的概率为0而2.5可能已经从任何值舍入一次在2.45和2.54999999999999之间...,如果我们使用我们在小学学习的0.5规则的舍入,那么双舍入意味着2.45和2.50之间的值将全部舍入到3(首先舍入到2.5).这往往会使估计偏向上升.为了消除这种偏见,我们需要在四舍五入之前回到2.5(这通常不可能是不切实际的),或者只是将一半的时间向上舍入并向下舍入一半的时间(或者更好的是与我们的可能性成比例要看低于或高于2.5的值四舍五入为2.5,但对于大多数基础分布,这将接近50/50).随机方法是让圆函数随机选择哪种方式进行舍入,但确定性类型不能与之相配,因此选择"舍入到偶数"(舍入到奇数应该大致相同)作为舍入的一致规则上下约50/50.
如果您正在处理2.5可能代表精确值(例如金钱)的数据,那么您可以通过将所有值乘以10或100并以整数运算,然后仅转换回最终打印来做得更好.请注意,2.50000001舍入为3,因此如果在最终打印之前保留更多精度数字,则舍入将按预期方向进行,或者您可以在舍入之前将值添加0.000000001(或其他小数字),但这可以向上偏向你的估计.
这似乎起作用:
rnd <- function(x) trunc(x+sign(x)*0.5)
阿南达·马赫托(Ananda Mahto)的回应似乎不仅可以做到这一点,而且还可以做更多-我不确定他回应中的额外代码占了什么;或者换句话说,我不知道如何破坏上面定义的rnd()函数。
例:
seq(-2, 2, by=0.5)
#  [1] -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0
round(x)
#  [1] -2 -2 -1  0  0  0  1  2  2
rnd(x)
#  [1] -2 -2 -1 -1  0  1  1  2  2
根据您对微调数据的舒适程度,这有效:
round(x+10*.Machine$double.eps)
# [1]  1  2  3  4  5  6  7  8  9 10