我试图将数字x舍入为数m。使用上一篇文章中关于SO的以下功能:
roundUP = function(x,m)
{
return(m * ceiling(x/m))
}
但是,当我输入x = 0.28和m = 0.005时,当结果应为0.28时,函数输出0.285。
当我尝试ceiling(0.28/0.005)
时,它输出57,结果应该是56,因为56已经是一个整数。任何人都可以解释这是否发生这种情况并且这是天花板功能的错误吗?
这个问题与浮点运算有关。你可以找到关于这个here的一些细节。
通过下面的代码,它应该揭示正在发生的事情。
0.28/0.005 # Console displays 56
0.28/0.005 == 56 # returns FALSE. Why?
print(0.28/0.005, digits = 18) # 56.0000000000000071
# Solution?
roundUP = function(x, m)
{
return(m * ceiling(round(x/m, 9)))
}
另请注意?ceiling
中的警告部分
计算机算术的现实可能导致意想不到的结果,尤其是楼层和天花板。例如,我们知道'x = 8的楼层(log(x,base = 8))是1,但是在R平台上看到了0。通常需要使用公差。
在R中,
floor(x)函数舍入到最接近的小于x的整数。
ceiling(x)函数舍入到最接近的整数,该整数大于x。
因此无论小数点后的值是什么,R都会考虑下一个整数(前/后)。
如果你想要56
作为输出,你必须使用floor(0.28/0.005)
。