我正在做一个乘以十进制数并将其转换为整数的简单操作,但结果似乎与预期不同。如果在其他地方讨论这个问题,请道歉,我无法找到任何直接的答案
> 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的行为有关,而与浮动计算无关
答案 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()
来避免这种情况。