【发布时间】:2017-02-08 19:41:54
【问题描述】:
我有一个包含许多数字(> 1E9 个元素)的向量,并且想要导出 数值精度(数字中的位数)和数值刻度(数字中小数点右侧的位数)。
我怎样才能做到这一点非常快(矢量化)?
存在一个带有部分答案的问题 (how to return number of decimal places in R),但解决方案既不快速(矢量化)也不计算数值精度。
例子:
# small example vector with numeric data
x <- c(7654321, 54321.1234, 321.123, 321.123456789)
> numeric.precision(x) # implementation is the answer
[1] 7, 9, 6, 12
> numeric.scale(x) # implementation is the answer
[1] 0, 4, 3, 9
可选的“糖”(稍后添加到此问题 - 感谢 @thc 和 @gregor):
如何避免由于计算机中数字存储方式的内部不精确性(例如浮点数)而过度计算位数?
> x = 54321.1234
> as.character(x)
[1] "54321.1234"
> print(x, digits = 22)
[1] 54321.12339999999676365
【问题讨论】:
-
您的输入应该是字符串,而不是数字。原因是允许浮点数稍微不精确。例如:a=0.15+0.15; b=0.1+0.2; a==b 是假的。
-
或者,与您的示例数据更相关:
x = 54321.1234; print(x, digits = 22) -
获取小数点左边位数的好方法是
trunc(log10(abs(x))) + 1。我把它留在这里,以防它在完整答案中有用。我不确定它将如何将速度方面与转换为字符进行比较。 -
如果你真的可以“保证我的位数有限”,那么在
format(x, digits = maxp, scientific = FALSE)上使用lmo 的nchar(sub())方法,其中maxp是您期望的数据的最大精度。 -
是的,但您说过您可以保证有限位数。我们已经证明 22 过多 -
format(x, digits = 14, scientific = F, trim = T, drop0trailing = T)适用于您的示例并且有一点缓冲。在这个例子中,你最多可以放 16 个。
标签: r