我正在尝试将数字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)
时,由于56已经是一个整数,因此结果为56时输出57。谁能解释这是否正在发生,并且这是Ceiling函数的错误?
答案 0 :(得分:4)
该问题与浮点算法有关。您可以找到有关此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的floor(log(x,base = 8))为1,但是在R上看到0 平台。通常必须使用公差。
答案 1 :(得分:-3)
在R中,
floor(x)函数四舍五入为最接近x的整数。
天花板(x)函数四舍五入为大于x的最接近的整数。
因此,无论小数点后的值是多少,R都会考虑下一个整数(之前/之后)。
如果要使用56
作为输出,则必须使用floor(0.28/0.005)
。