【问题标题】:Issue with character data type length in R & decimal precisionR 和小数精度中的字符数据类型长度问题
【发布时间】:2015-05-06 07:08:09
【问题描述】:

试图创建一个函数来获取数值数据的精度。 (小数点右边的位数)

    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 将“dec_part”强制为只能存储 16 位的字符串。

有没有办法克服 R 中的这个限制?

对于数字数据,nchar 是否有替代品?

(R 版本 3.1.1 64 位)

【问题讨论】:

    标签: r type-conversion


    【解决方案1】:

    “问题”不在nchar 中,而是在gsub 中,它将as.character 应用于非字符xas.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"
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2014-02-15
      • 2016-03-11
      相关资源
      最近更新 更多