例如:我有數量123.456,並希望小數點前返回456如何隔離R中的小數點後的數字?
功能trunc()
基本隔離(truncates)的數字。
是否有一個函數來隔離小數點後面的數字?
兩個後續問題:
有沒有辦法做到這一點,而無需編寫出來的正則表達式?
如果我想維護標誌怎麼辦?例如,如果我想(反向)截斷-123.456到-456。
例如:我有數量123.456,並希望小數點前返回456如何隔離R中的小數點後的數字?
功能trunc()
基本隔離(truncates)的數字。
是否有一個函數來隔離小數點後面的數字?
兩個後續問題:
有沒有辦法做到這一點,而無需編寫出來的正則表達式?
如果我想維護標誌怎麼辦?例如,如果我想(反向)截斷-123.456到-456。
我不喜歡這些操作的文本處理。
棘手的部分是將分數轉換爲整數。在這裏我使用一個循環。這不太可能需要很多迭代。所以,性能可能不是問題。
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
使用模運算符(%%)與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)
這是另一種方式去
> x <- c(123.456, -123.456)
> sign(x) * as.integer(sapply(strsplit(as.character(x), "\\."), "[", 2))
[1] 456 -456
'號(X)*(ABS(X)%% 1)' – Gregor
@Gregor那不是'的x TRUNC(x)的'? – lukeA
哎呀,錯過了一個整數是想要的。似乎浮點算術問題等着你。很不錯,許多答案正在處理這個問題,但將其作爲小數保留似乎更安全。 – Gregor