Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解释R中x.x5的小数点后1位舍入?_R_Rounding_Ieee 754 - Fatal编程技术网

如何解释R中x.x5的小数点后1位舍入?

如何解释R中x.x5的小数点后1位舍入?,r,rounding,ieee-754,R,Rounding,Ieee 754,我正在寻找一个解释,说明在R中,1位小数舍入是如何对这样的序列起作用的: seq(1.05,2.95,by=.1) 高中的时候,我会把这个加起来,即2.05变成2.1。但R将其四舍五入为2,小数点后1位四舍五入 上述stackoverflow答案中的以下舍入功能始终实现高中舍入: round2 = function(x, n) { posneg = sign(x) z = abs(x)*10^n z = z + 0.5 z = trunc(z) z = z/10^n z

我正在寻找一个解释,说明在R中,1位小数舍入是如何对这样的序列起作用的:

seq(1.05,2.95,by=.1)

高中的时候,我会把这个加起来,即2.05变成2.1。但R将其四舍五入为2,小数点后1位四舍五入

上述stackoverflow答案中的以下舍入功能始终实现高中舍入:

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
}
此代码比较R舍入和从上方舍入

data.frame(cbind(
  Number = seq(1.05, 2.95, by = .1), 
  Popular.Round = round2(seq(1.05, 2.95, by = .1), 1),
  R.Round = round(seq(1.05, 2.95, by = .1), 1)))
R四舍五入时,1.05四舍五入为1.1,而2.05四舍五入为2。然后再次将1.95四舍五入为2,并将2.95四舍五入为3

如果是“从圆到偶数”,为什么是3,即奇数


当被问及这种行为时,有没有比“处理它”更好的回答?

太长而无法阅读?在下方滚动

对我个人来说,这是一项有趣的研究。根据文件:

请注意,对于5的舍入,IEC 60559标准(另见“IEEE 754')应使用“转到偶数”。所以 圆形(0.5)为0,圆形(-1.5)为-2。然而,这取决于 OS服务和on表示错误(例如,0.15不是 精确表示时,舍入规则适用于所表示的 数字,而不是打印的数字,因此可以使用四舍五入(0.15,1) 0.1或0.2)

四舍五入为负数意味着四舍五入为的幂 十,例如,四舍五入(x,数字=-2)四舍五入到最接近的数字 一百

对于signif,数字的识别值为1…22,且不缺失 值将舍入到该范围内最接近的整数。复杂的 数字四舍五入,以保留指定的数字位数 较大的组件。向量的每个元素都是四舍五入的 单独的,不同于印刷

首先,您问“如果是“从整数到偶数”,为什么是3,即奇数。”为了清楚起见,从整数到偶数规则适用于将5四舍五入。如果运行
轮(2.5)
轮(3.5)
,则R分别返回2和4

如果你走到这里,你会看到这样的反应:

本轮谈判的逻辑是,我们正试图 表示一个基本的连续值,如果x来自 连续分布,则x==2.5的概率为0 2.5可能已经从2.45和2.5499999999999之间的任何值中四舍五入了一次…,如果我们使用我们在小学学到的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(或 在四舍五入之前,将其他小数值)转换为您的值,但这可以 把你的估计向上倾斜

简短回答:如果你总是向上舍入5,那么你的数据会向上偏移。但如果你逐日取整,那么你的取整数据总体上会变得平衡

让我们使用您的数据对此进行测试:

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 <- data.frame(cbind(
  Number = seq(1.05, 2.95, by = .1), 
  Popular.Round = round2(seq(1.05, 2.95, by = .1), 1),
  R.Round = round(seq(1.05, 2.95, by = .1), 1)))

> mean(x$Popular.Round)
[1] 2.05
> mean(x$R.Round)
[1] 2.02
round2=函数(x,n){
posneg=符号(x)
z=abs(x)*10^n
z=z+0.5
z=trunc(z)
z=z/10^n
z*posneg
}
x平均值(x$Popular.Round)
[1] 2.05
>平均值(x$R.轮)
[1] 2.02
使用更大的样本:

x <- data.frame(cbind(
  Number = seq(1.05, 6000, by = .1), 
  Popular.Round = round2(seq(1.05, 6000, by = .1), 1),
  R.Round = round(seq(1.05, 6000, by = .1), 1)))

> mean(x$Popular.Round)
[1] 3000.55
> mean(x$R.Round)
[1] 3000.537
x平均值(x$Popular.Round)
[1] 3000.55
>平均值(x$R.轮)
[1] 3000.537
这与一个浮点问题有关(关于这个问题有几个问题,它们会定期弹出)。这不是R所独有的。缓和:添加一个“ε”(比预期显著性小的数字):
四舍五入(1e-9+seq(1.05,2.95,by=.1),1)
产生预期输出。