上限函数显然不正确地四舍五入

Ceiling function apparently rounds incorrectly

谁能解释一下为什么 R 在 rounding/ceiling 上有问题,以及如何确保它计算正确?

N = 50e3
x = vector(length = N)
p = 0.995

ceiling(length(x)*(1-p))
251

ceiling(N*(1-p))
251

ceiling(N*0.005)
250

ceiling(50e3*0.005)
250

@rawr 链接到 Why are these numbers not equal? ,它解释了浮点计算的基本问题。在这种情况下:

print((1-0.995) - 0.005)
## [1] 4.336809e-18

因此,(1-0.005)*5e4 略微 大于 250(要查看此内容,您必须 print((1-0.005)*5e4, digits=22),因为 R 打印 默认情况下的舍入表示法)因此 ceiling() 将答案推到 251。

在这种 特殊的 情况下,您似乎可以通过将 (1-p) 四舍五入到小数点后三位 ceiling(N*round(1-p,3)) 来获得所需的答案——但您绝对应该阅读链接的答案并考虑此解决方案是否能够满足您的所有需求。