四舍五入的数字如何存储在 R 中?
Posted
技术标签:
【中文标题】四舍五入的数字如何存储在 R 中?【英文标题】:How are rounded numbers stored in R? 【发布时间】:2016-03-03 15:32:29 【问题描述】:我在网上找到了很多关于此的信息,但我找不到任何准确回答我的问题的信息。我的问题与数字的呈现无关,而是与呈现下方的计算和存储有关。
问题在于 R 中的浮点数。我希望截断它们;但是,我想确保在它们被截断后正确存储它们。
问题是:我有一个数据集,我试图将不同数字之间的差异与我想要的任何阈值进行比较(精确到小数点后 2 位 - 即 0.00、0.05 和 1.00。)。我想确保当我将差异测试为零时,它正在测试完全正确的差异,并且后面没有我不知道的存储问题。
到目前为止,我已经尝试过:
(1) round
(并针对 0 和非常小的值进行测试,例如 1e-10
)
(2)乘以100和as.integer
当我计算数据集中差异大于我选择的阈值的观察百分比时,这些计算得出不同的答案。
简而言之,在计算差值是否实际为 0 时,如果知道如何最好地存储数字以获得最准确的结果,那就太好了。
注意:这需要适用于大型数据集。
例子:
dt <-
data.table(d = c(0.00, 988.36, 0.00, 2031.46, 0.00),
c = c(0.00, 30.00, 0.00, 2031.46, 0.00),
n = c("a", "b", "a", "a", "b"))
dt[, diff := d - c]
dt[, abs_diff := abs(diff)]
dt[, pct_diff := mean(abs_diff == 0, na.rm = TRUE), by = "n"]
最后一步是问题所在,因为我不断根据阈值获得 pct_diff
的不同数字。 (例如,mean(abs_diff <= 1e-10)
和 mean(abs_diff <= 1e-15)
给了我不同的答案)。
【问题讨论】:
您应该提供某种形式的reproducible example,以便更清楚地了解发生了什么。 你能举一些例子和你想要的输出吗?我既不完全理解exactly 0
的意思,也不完全理解您的舍入过程。何时正确存储数字?正确的区别是什么?
当然 - 我可以添加一个示例。
您发布的示例中的结果对我来说看起来很正常。他们怎么了?此外,您不应该比较浮点值。您的数据真的关心差异是 10^-10 还是正好 0?
我不在乎数据是否有细微差别——我只是想正确地捕捉差异。我想将它们与 0.01 值进行比较。我只是想以最准确的方式捕捉到这一点——根据我使用的方法,我不断得到不同的答案。
【参考方案1】:
四舍五入的数字存储为numeric
,即浮点数:
class(round(1.1))
#[1] "numeric"
class(floor(1.1))
##[1] "numeric"
您似乎正在寻找支持任意精度数字的包,例如包 Rmpfr。
【讨论】:
以上是关于四舍五入的数字如何存储在 R 中?的主要内容,如果未能解决你的问题,请参考以下文章