gpt4 book ai didi

r - 为什么 R 中的 as.integer 使值递减?

转载 作者:行者123 更新时间:2023-12-04 12:13:38 26 4
gpt4 key购买 nike

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

> 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

编辑2 :根据评论,感谢@andrey-shabalin
> temp2
[1] 119060
> as.integer(temp2)
[1] 119059
> as.integer(round(temp2))
[1] 119060

EDIT3:正如评论中提到的,问题与 as.integer 的行为有关,而不是关于 float 计算

最佳答案

对此的答案是“浮点错误”。通过检查以下内容,您可以轻松看到这一点:

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

由于浮点错误,temp2 不完全是 119060,而是:
> sprintf("%.20f", temp2)
[1] "119059.99999999998544808477"

如果您使用 as.integer在 float 上,它的工作方式与 trunc 相同,即它确实在 0 的方向上围绕浮点数。所以在这种情况下,它变成了 119059。

如果您使用 as.character() 转换为字符, R 将确保它使用最多 15 个有效数字。在这个例子中,这将是“119059.999999999”。下一个数字是另一个 9,因此 R 将在转换前将其四舍五入为 119060。我在上面的代码中使用 sprintf() 避免了这种情况而不是 as.character() .

关于r - 为什么 R 中的 as.integer 使值递减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43497021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com