2014-04-18 55 views
7

这看起来应该是一个相当容易解决的问题,但我在查找答案时遇到了一些问题。将小数截断为指定位置

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

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

谢谢。

+2

对于预包装的功能之前,将数字转换为字符串,尝试'plyr :: round_any(0.1234567,精度= .0001,f = floor)' –

回答

13
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 
+0

但是: 'trunc(1234567.2,prec = 5)'给出1234567.我们不想要“1234567.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)) 
0

我长时间使用了上述工艺。有一天,我有,当我的结果复制到一个文本文件中的一些问题,我解决我这样的问题:

trunc_number_n_decimals <- function(numberToTrunc, nDecimals){ 
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 只记得写入文件,使用格式()

numberToWrite <- format(trunc_number_n_decimals(9.1762034354551236, 9), digits=20)