R中的天花板功能不正确(有时)

时间:2018-09-02 03:46:20

标签: r rounding ceiling

我正在尝试将数字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函数的错误?

2 个答案:

答案 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)