问题:
ceiling(31)
#31
ceiling(31/60*60)
#32
解决此类错误的正确方法是什么?
在除法之前进行乘法不是一个选项,我的代码看起来像这样:
x <- 31/60
...
y <- ceiling(x*60)
我正在考虑做一个新功能:
ceil <- function(x) {
ceiling(signif(x))
}
但我是R的新手,也许有更好的方法。
更新
抱歉,我没有提供更多详细信息,出于不同的原因,我在代码的不同部分遇到了同样的问题,但总是有上限。
我知道浮点计算中的舍入误差。也许问题的标题可以改进,我不想修复天花板功能的不精确,我想要做的可能是相反的,使天花板不那么准确。告诉R忽略明显噪音的数字的方法:
options(digits=17)
31/60*60
#31.000000000000004
但是,显然,忽略噪声数字所需的epsilon取决于问题的背景。
答案 0 :(得分:1)
我坚信,这里的真正问题出现在我的英雄The Data Munger Guru的标语中,即:“你要解决的问题是什么? 告诉我你想做什么,而不是你想怎么做。 “
有无数种情况,浮点精度会导致明显的整数变成“整数+/- epsilon”,所以你需要弄清楚你为什么选择“天花板”,为什么你允许你的值不是整数等等。 - 或多或少是Pascal Cuoq在评论中写的。
因此,您关注的解决方案取决于实际发生的情况。也许你想要,说trunc(x/60)->y
跟着trunc(y*60)
,或者不是:-)。也许你想要y<-round(x/60*60) +1
,或jhoward的建议方法。正如我在此强调的那样,这取决于你的目标是什么以及你想如何处理角落案件。