【发布时间】:2013-06-02 08:21:00
【问题描述】:
我从 MySQL 表中读取以 DECIMAL 格式存储的数据。我想对 R 中的这些数字进行计算。
我曾经使用as.numeric() 将它们转换为数字表示,但文档说:
numeric 与 double(和 real)相同。
但是 R 中还有数据类型 Decimal 吗? (没有舍入错误的数据类型,...)
这里有一个关于舍入错误问题的简单示例:
numbersStrings = c("0.1", "0.9")
numbersNumeric = as.numeric(numbersStrings)
numbersMirror = c(numbersNumeric, 1-numbersNumeric)
str(numbersMirror)
numbersMirror
unique(numbersMirror) # has two times 0.1 ...
sprintf("%.25f", numbersMirror)
sprintf("%.25f", unique(numbersMirror)) # ... because there was a rounding error
【问题讨论】:
-
这可能有用:cran.r-project.org/web/packages/Rmpfr/index.html 这是一个在 R 中执行任意精度浮点运算的库。
-
MySQL 文档清楚地表明 DECIMAL 不是任意精度。它确实允许比“双”(53)表示的数字更多(64)。它还清楚地表明,如果小数点右侧的数字超过所选限制,则需要截断。我怀疑将双精度截断到特定限制可以满足大多数需求。
-
很好的例子。我通过使用
table()解决了类似的问题(这里你可以使用table(numbersMirror))。表似乎四舍五入。我没有关于它如何圆的详细信息,但对于你的例子,它似乎有效。无论如何:十进制数据类型应该更精确。 (当然只适用于 -/+ 操作)。 @DWin:我认为您的意思是round()而不是截断。 -
@DWin,
Rmpfr可以设置为使用 64 位。我写了“任意精度”,但我的意思是“多精度”。 :-) 仅使用doubles 无法在“普通 R”中实现这一点。 -
这将是一个要管理的 PITA,因为您需要将“数字”作为字符表示形式从 MySQL 中引入,然后转换为 Rmpfr,然后再转换回字符,然后在 MySQL 中编写代码将字符转换为十进制。
标签: r decimal numeric rounding-error