我正在做一个十进制数相乘并将其转换为整数的简单操作,但结果似乎与预期不同。抱歉,如果在其他地方对此进行了讨论,我无法找到任何直接的答案
> as.integer(1190.60 * 100)
[1] 119059
Run Code Online (Sandbox Code Playgroud)
编辑: 所以,我必须将其转换为字符,然后执行 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
Run Code Online (Sandbox Code Playgroud)
EDIT2:根据评论,感谢@andrey-shabalin
> temp2
[1] 119060
> as.integer(temp2)
[1] 119059
> as.integer(round(temp2))
[1] 119060
Run Code Online (Sandbox Code Playgroud)
EDIT3:正如评论中提到的,问题与 as.integer 的行为有关,而不是关于浮动计算
对此的答案是“浮点错误”。通过检查以下内容,您可以轻松看到这一点:
> temp <- 1190.60
> temp2 <- 1190.60 * 100
> temp2 - 119060
[1] -1.455192e-11
Run Code Online (Sandbox Code Playgroud)
由于浮点错误,temp2 不完全是 119060,而是:
> sprintf("%.20f", temp2)
[1] "119059.99999999998544808477"
Run Code Online (Sandbox Code Playgroud)
如果您as.integer在浮点数上使用,它的工作方式与 相同trunc,即它会在 0 的方向上环绕浮点数。因此在这种情况下,它变为 119059。
如果使用 转换为字符as.character(),R 将确保它使用最多 15 个有效数字。在这个例子中,这将是“119059.999999999”。下一个数字是另一个 9,因此 R 将在转换前将其四舍五入为 119060。我在上面的代码中通过使用sprintf()而不是as.character().