为什么as.integer in R递减值?

时间:2017-04-19 13:21:56

标签: r

我正在做一个乘以十进制数并将其转换为整数的简单操作,但结果似乎与预期不同。如果在其他地方讨论这个问题,请道歉,我无法找到任何直接的答案

> as.integer(1190.60 * 100)
[1] 119059

修改 所以,我必须将其转换为字符,然后执行as.integer以获得预期的内容

> temp <- 1190.60
> temp2 <- 1190.60 * 100
> class(temp)
[1] "numeric"
> class(temp2)
[1] "numeric"
> as.character(temp2)
[1] "119060"
> as.integer(temp2)
[1] 119059
> as.integer(as.character(temp2))
[1] 119060

EDIT2 :根据评论,感谢@ andrey-shabalin

> temp2
[1] 119060
> as.integer(temp2)
[1] 119059
> as.integer(round(temp2))
[1] 119060

EDIT3:正如评论中所提到的,问题与as.integer的行为有关,而与浮动计算无关

1 个答案:

答案 0 :(得分:3)

答案是&#34;浮点错误&#34;。您可以通过查看以下内容轻松查看:

> temp <- 1190.60
> temp2 <- 1190.60 * 100
> temp2 - 119060
[1] -1.455192e-11

由于浮点错误,temp2并非完全是119060,而是:

> sprintf("%.20f", temp2)
[1] "119059.99999999998544808477"

如果在浮点数上使用as.integer,它的工作方式与trunc的工作方式相同,即它沿着0的方向绕浮点数运算。因此在这种情况下,它变为119059。

如果您使用as.character()转换为字符,则R会确保它使用最多15位有效数字。在这个例子中,将是&#34; 119059.999999999&#34;。下一个数字是另一个9,所以R将在转换前将其舍入到119060。我在上面的代码中使用sprintf()而不是as.character()来避免这种情况。