四舍五入的数字如何存储在 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 &lt;= 1e-10)mean(abs_diff &lt;= 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 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在动作脚本中舍入数字

在角度 2 中,如何将数字显示为两位小数的四舍五入货币?

如何在 Java 中格式化数字?

如何在 Matlab 中将数字四舍五入到 10 个正确的小数位

如何连接四舍五入的数字字符串python?

如何将gridview中的货币四舍五入为有效数字?