从字符转换为数字时的舍入错误

时间:2016-06-07 20:25:15

标签: r time timestamp type-conversion numeric

我有一个data.table数据编号的字符格式,我试图转换为数字。然而问题是数字很长,我想保留所有数字,而不需要从R舍入。例如,data.table的前5个元素:

> TimeO[1]
[1] "20110630224701281482"
> TimeO[2]
[1] "20110630224701281523"
> TimeO[3]
[1] "20110630224701281533"
> TimeO[4]
[1] "20110630224701281548"
> TimeO[5]
[1] "20110630224701281762"

我编写了一个将字符转换为数字的函数:

convert_time_fast <- function(tim){  
  b <- tim - tim%/%10^12*10^12
  # hhmmssffffff
  ms <- b%%10^6; b <-(b-ms)/10^6
  ss <- b%%10^2; b <-(b-ss)/10^2
  mm <- b%%10^2; hh <-(b-mm)/10^2
  # if hours>=22, subtract 24 (previous day)
  hh <- hh - (hh>=22)*24
  return(hh+mm/60+ss/3600+ms/(3600*10^6))
}

然而,舍入发生在R中,因此数据点现在具有相同的时间。转换后见前5个元素:

TimeOC <--convert_time_fast(as.numeric(TimeO))
> TimeOC[1]
[1] 1.216311
> TimeOC[2]
[1] 1.216311
> TimeOC[3]
[1] 1.216311
> TimeOC[4]
[1] 1.216311
> TimeOC[5]
[1] 1.216311

任何帮助解决这个问题都将非常感谢!

1 个答案:

答案 0 :(得分:0)

你应该测试一下它们是否真的相等(all.equal()) 通常R限制它打印的位数(通常为7),但它们仍在那里。

另见这个例子:

> as.numeric("1.21631114")
[1] 1.216311
> as.numeric("1.21631118")
[1] 1.216311
> all.equal(as.numeric("1.21631114"), as.numeric("1.21631118"))
[1] "Mean relative difference: 3.288632e-08" # which indicates they're not the same