你如何隔离R中小数点后的数字?

How do you isolate the digits following a decimal in R?

例如:我有号码 123.456,想 return456。

函数 trunc() 基本上隔离 (truncates) 数字 小数点之前。

是否有函数可以仅隔离小数点之后的数字?

两个后续问题:

  1. 有没有办法不用写出正则表达式就可以做到这一点?

  2. 如果我想维护标志怎么办?例如,如果我想(反转)将 -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)

如果我们真的想报告只是小数点后的数字(即不包括0和小数点),我们可以执行以下操作(为清楚起见,分 2 个步骤呈现):

x <- -123.456
y <- sign(x) * (abs(x) %% 1)
as.numeric(gsub("0.","",y))
[1] -456  #as desired from part 2 in the OP

这是另一条路

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