2016-09-30 76 views
3

例如:我有數量123.456,並希望小數點前返回456如何隔離R中的小數點後的數字?

功能trunc()基本隔離(truncates)的數字

是否有一個函數來隔離小數點後面的數字

兩個後續問題:

  1. 有沒有辦法做到這一點,而無需編寫出來的正則表達式?

  2. 如果我想維護標誌怎麼辦?例如,如果我想(反向)截斷-123.456到-456。

+0

'號(X)*(ABS(X)%% 1)' – Gregor

+0

@Gregor那不是'的x TRUNC(x)的'? – lukeA

+0

哎呀,錯過了一個整數是想要的。似乎浮點算術問題等着你。很不錯,許多答案正在處理這個問題,但將其作爲小數保留似乎更安全。 – Gregor

回答

3

我不喜歡這些操作的文本處理。

棘手的部分是將分數轉換爲整數。在這裏我使用一個循環。這不太可能需要很多迭代。所以,性能可能不是問題。

fun <- function(x) { 
    y <- abs(x) - floor(abs(x)) 

    n <- 0 
    while (abs(y - round(y, n)) > .Machine$double.eps^0.5) { 
    n <- n + 1 
    } 

    sign(x) * y * 10^n 
} 

fun(123.456) 
#[1] 456 
fun(-123.456) 
#[1] -456 
2

使用模運算符(%%)與1作爲代理工程我猜。它成功地分離出小數點後的數字,但保留小數點:

123.456 %% 1 
[1] 0.456 

但是,僅在該標誌不會被保留,也不是報道正確的號碼(B/C的模運算的功能,適用於正數):

-123.456 %% 1 
[1] 0.544 #not what is wanted 

包括abs()修正了問題,但沒有幫助報告標記。符號可以是包括通過添加:

sign(x) * (abs(x) %% 1) 
1

這是另一種方式去

> x <- c(123.456, -123.456) 
> sign(x) * as.integer(sapply(strsplit(as.character(x), "\\."), "[", 2)) 
[1] 456 -456