2014-04-18 13 views
7

Wygląda na to, że problem powinien być dość łatwy do rozwiązania, ale mam problem ze znalezieniem odpowiedzi.Przycinanie miejsc dziesiętnych do podanych miejsc

Mam wektor, który zawiera długie znaki dziesiętne i chcę obcinać je do określonej liczby miejsc po przecinku. Nie chcę tego zaokrąglać, ale po prostu usuwać wartości przekraczające moją pożądaną liczbę miejsc po przecinku.

Na przykład chciałbym, aby 0.123456789 zwróciło 0.1234, jeśli chcę 4 cyfry dziesiętne. Nie jest to kwestia drukowania określonej liczby cyfr, ale zwracania pierwotnej wartości obciętej do podanej liczby.

Dzięki.

+2

dla paczkowanych funkcji, spróbuj 'plyr :: round_any (.1234567, dokładność = .0001, f = podłoga) ' –

Odpowiedz

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

plony 0.1234 jak oczekiwano.

Bardziej ogólnie,

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

Ale: ' trunc (1234567.2, prec = 5) 'daje 1234567. Czy nie chcemy" 1234567.2 "? –

0

Nie jest to najbardziej elegancki sposób, ale to działa.

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

Użyłem powyższych technik przez długi czas. Pewnego dnia miałem pewne problemy, kiedy kopiowanie wyników do pliku tekstowego i rozwiązać mój problem w ten sposób:

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 

To rozwiązanie jest bardzo przydatne w przypadku, gdy jego potrzeby zapisu do pliku liczba z wiele miejsc po przecinku, takich jak 16. Wystarczy pamiętać, aby przekonwertować liczbę na łańcuch przed zapisaniem do pliku, używając formatu()

numberToWrite <- format(trunc_number_n_decimals(9.1762034354551236, 9), digits=20) 
Powiązane problemy