尝试创建一个函数来获取数值数据的精度。 (小数点右边的位数)
decimalplaces <- function(x) {
if (x %% 1 != 0) {
pattern <- "^([0-9]+)[.]([0-9]+)$"
dec_part <- gsub(pattern,"\\2", x)
nchar(dec_part)
} else {
return(0)
}
}
超过16位的值出现问题 - nchar
强制&#34; dec_part&#34;到一个只能存储16位数的字符串。
有没有办法克服R中的这个限制?
数字数据是否有nchar
的替代品?
(R版本3.1.1 64位)
答案 0 :(得分:2)
问题&#39;不在nchar
但在gsub
中,as.character
适用于非字符x
。 as.character
的文档说:
as.character表示实数和复数到15显着 数字(技术上是编译器对ISO C常数的设置) DBL_DIG,在支持IEC60559算术的机器上将是15 根据C99标准)。这确保了所有数字 结果将是可靠的(而不是表示的结果 错误),但确实意味着转换为字符并返回数字 可能会改变这个数字。如果要将数字转换为字符 以最大可能的精度,使用格式。
所以,你可以使用
dec_part <- gsub(pattern,"\\2", format(x,digits=22))
而不是
dec_part <- gsub(pattern,"\\2", x)
在您的代码中,但要小心,因为有充分理由设置了15位有效数字限制,因此很有可能在尾随数字中找到噪音。例如,
> format(1/3,digits=22)
[1] "0.3333333333333333148296"