将十进制截断为指定的位置

时间:2014-04-18 16:29:03

标签: r

这似乎应该是一个相当容易解决的问题,但我在找到答案时遇到了一些麻烦。

我有一个包含长小数的向量,我想将其截断为特定的小数。我不想舍入它,而只是删除超出我想要的小数位数的值。

例如,如果我需要4位十进制数字,我希望0.123456789返回0.1234。这不是打印特定数字的数字而是将原始值截断为给定数字的问题。

感谢。

3 个答案:

答案 0 :(得分:17)

trunc(x*10^4)/10^4

收益率0.1234与预期相符。

更一般地说,

trunc <- function(x, ..., prec = 0) base::trunc(x * 10^prec, ...) / 10^prec;
print(trunc(0.123456789, prec = 4) # 0.1234
print(trunc(14035, prec = -2), # 14000

答案 1 :(得分:2)

我使用了上面的技术很长一段时间。有一天,当我将结果复制到文本文件时,我遇到了一些问题,我以这种方式解决了我的问题:

trunc_number_n_decimals <- function(numberToTrunc, nDecimals){
numberToTrunc <- numberToTrunc + (10^-(nDecimals+5))
splitNumber <- strsplit(x=format(numberToTrunc, digits=20, format=f), split="\\.")[[1]]
  decimalPartTrunc <- substr(x=splitNumber[2], start=1, stop=nDecimals)
  truncatedNumber <- as.numeric(paste0(splitNumber[1], ".", decimalPartTrunc))
  return(truncatedNumber)
}
print(trunc_number_n_decimals(9.1762034354551236, 6), digits=14)
[1] 9.176203
print(trunc_number_n_decimals(9.1762034354551236, 7), digits=14)
[1] 9.1762034
print(trunc_number_n_decimals(9.1762034354551236, 8), digits=14)
[1] 9.17620343
print(trunc_number_n_decimals(9.1762034354551236, 9), digits=14)
[1] 9.176203435

这种解决方案非常方便,因为它需要向文件写入带有许多小数的数字,例如16。 请记住在使用format()

写入文件之前将数字转换为字符串
numberToWrite <- format(trunc_number_n_decimals(9.1762034354551236, 9), digits=20)

答案 2 :(得分:0)

不是最优雅的方式,但它会起作用。

string_it<-sprintf("%06.9f", old_numbers)
pos_list<-gregexpr(pattern="\\.", string_it)
pos<-unlist(lapply(pos_list, '[[', 1)) # This returns a vector with the first 
#elements
#you're probably going to have to play around with the pos- numbers here
new_number<-as.numeric(substring(string_it, pos-1,pos+4))