R 正数的固定和小数位数

R 正数的固定和小数位数,r,decimal,fixed,digits,R,Decimal,Fixed,Digits,我想写一个函数来计算每个正数的固定位数和小数位数。对于整数:例如,对于数字459,我想看看 fixed=3 and decimal=0 作为函数的输出。 对于十进制数:例如,对于数字12.657,我希望看到 fixed=2 and decimal=3 0 fixed=0 and decimal=4 fixed=0 and decimal=2 (因为12有两位数,657有三位数)。对于小于1的数字,我希望看到 fixed=2 and decimal=3 0 fixed=0 an

我想写一个函数来计算每个正数的固定位数和小数位数。对于整数:例如,对于数字459,我想看看

fixed=3 and decimal=0
作为函数的输出。 对于十进制数:例如,对于数字12.657,我希望看到

fixed=2 and decimal=3
0 
fixed=0 and decimal=4 
fixed=0 and decimal=2
(因为12有两位数,657有三位数)。对于小于1的数字,我希望看到

fixed=2 and decimal=3
0 
fixed=0 and decimal=4 
fixed=0 and decimal=2
作为固定的,例如数字0.4056,我想看看

fixed=2 and decimal=3
0 
fixed=0 and decimal=4 
fixed=0 and decimal=2
或者我想看看0.13号

fixed=2 and decimal=3
0 
fixed=0 and decimal=4 
fixed=0 and decimal=2
我的大致想法如下:

digits<-function(x){
  length(strsplit(as.character(x),split="")[[1]])
}

数字我认为这是办不到的。我们不能假设一个简单的数值在计算机中被准确地表示出来。大多数浮点值当然不能

在R控制台输入0.3:

> 0.3
[1] 0.3
看起来不错,不是吗?但现在,让我们这样做:

> print(0.3, digits=22)
[1] 0.29999999999999999
本质上,如果将浮点数转换为字符串,则可以定义所需的精度。计算机不能给你这样的精度,因为它把所有的数字都存储在位中,因此永远不会给你绝对的精度。即使你看到的数字是0.3,你认为它有0个固定数字和1个小数点,这是因为R选择这样打印,而不是因为这是计算机内存中表示的数字


其他答案证明函数可以处理简单的情况。我必须承认,我知道R在解释数字方面做得非常出色。但我们必须小心!一旦我们开始转换数字,这样的函数就不能保证得到有意义的结果。

我认为这是不可能的。我们不能假设一个简单的数值在计算机中被准确地表示出来。大多数浮点值当然不能

在R控制台输入0.3:

> 0.3
[1] 0.3
看起来不错,不是吗?但现在,让我们这样做:

> print(0.3, digits=22)
[1] 0.29999999999999999
本质上,如果将浮点数转换为字符串,则可以定义所需的精度。计算机不能给你这样的精度,因为它把所有的数字都存储在位中,因此永远不会给你绝对的精度。即使你看到的数字是0.3,你认为它有0个固定数字和1个小数点,这是因为R选择这样打印,而不是因为这是计算机内存中表示的数字

其他答案证明函数可以处理简单的情况。我必须承认,我知道R在解释数字方面做得非常出色。但我们必须小心!一旦我们开始转换数字,这种功能就无法保证获得有意义的结果。

编辑(基于评论):

以下功能适用于有效数字小于等于15的数字:

digits<-function(x){
  ## make sure x is a number, if not stop 
  tryCatch(
    {
      x/1
    },
    error=function(cond) {
      stop('x must be a number')
    }
  )
  ## use nchar() and strsplit() to determine number of digits before decimal point
  fixed<-nchar(strsplit(as.character(x),"\\.")[[1]][1])
  ## check if negative
  if(substr(strsplit(as.character(x),"\\.")[[1]][1],1,1)=="-"){fixed<-fixed-1}
  ## check if -1<x<1
  if(as.numeric(strsplit(as.character(x),"\\.")[[1]][1])==0){fixed<-fixed-1}
  ## use nchar() and strsplit() to determine number of digits after decimal point
  decimal<-nchar(strsplit(as.character(x),"\\.")[[1]][2])
  ## for integers, replace NA decimal result with 0
  if(is.na(nchar(strsplit(as.character(x),"\\.")[[1]][2]))){decimal<-0}
  ## return results
  print(paste0("fixed: ",fixed," and decimal: ", decimal))
}
注:15位或更少有效数字限制基于8字节浮点表示

我能够克服这个问题的唯一方法是使用下面的代码

digits<-function(x){
  tryCatch(
    {
      as.numeric(x)/1
    },
    error=function(cond) {
      stop('x must be a number')
    }
  )
  j <- 0
  num <- x
  fixed <- 0
  decimal <- 0
  for(i in 1:nchar(x)){
    if(substr(num, i, i) == "."){
      j <- 1
    } else if(j==0){
      fixed <- fixed + 1
    } else{
      decimal <- decimal + 1
    }
  }
  if(substr(x,1,1)=="-" & substr(as.numeric(x),2,2)==0){
    fixed<-fixed-2
  }else if(substr(x,1,1)=="-"){
    fixed<-fixed-1
  }else if(substr(as.numeric(x),1,1)==0){
    fixed<-fixed-1
  }else{}
  print(paste0("fixed: ",fixed," and decimal: ", decimal))
}
[1] “固定值:1,小数点:18”

我希望这至少能有所帮助

编辑(基于评论):

以下功能适用于有效数字小于等于15的数字:

digits<-function(x){
  ## make sure x is a number, if not stop 
  tryCatch(
    {
      x/1
    },
    error=function(cond) {
      stop('x must be a number')
    }
  )
  ## use nchar() and strsplit() to determine number of digits before decimal point
  fixed<-nchar(strsplit(as.character(x),"\\.")[[1]][1])
  ## check if negative
  if(substr(strsplit(as.character(x),"\\.")[[1]][1],1,1)=="-"){fixed<-fixed-1}
  ## check if -1<x<1
  if(as.numeric(strsplit(as.character(x),"\\.")[[1]][1])==0){fixed<-fixed-1}
  ## use nchar() and strsplit() to determine number of digits after decimal point
  decimal<-nchar(strsplit(as.character(x),"\\.")[[1]][2])
  ## for integers, replace NA decimal result with 0
  if(is.na(nchar(strsplit(as.character(x),"\\.")[[1]][2]))){decimal<-0}
  ## return results
  print(paste0("fixed: ",fixed," and decimal: ", decimal))
}
注:15位或更少有效数字限制基于8字节浮点表示

我能够克服这个问题的唯一方法是使用下面的代码

digits<-function(x){
  tryCatch(
    {
      as.numeric(x)/1
    },
    error=function(cond) {
      stop('x must be a number')
    }
  )
  j <- 0
  num <- x
  fixed <- 0
  decimal <- 0
  for(i in 1:nchar(x)){
    if(substr(num, i, i) == "."){
      j <- 1
    } else if(j==0){
      fixed <- fixed + 1
    } else{
      decimal <- decimal + 1
    }
  }
  if(substr(x,1,1)=="-" & substr(as.numeric(x),2,2)==0){
    fixed<-fixed-2
  }else if(substr(x,1,1)=="-"){
    fixed<-fixed-1
  }else if(substr(as.numeric(x),1,1)==0){
    fixed<-fixed-1
  }else{}
  print(paste0("fixed: ",fixed," and decimal: ", decimal))
}
[1] “固定值:1,小数点:18”


我希望这至少能有所帮助

你似乎有点希望能做到这一点。好吧,这里有一个粗略的方法:

fun <- function(x){
  stopifnot(is.numeric(as.numeric(x)))
  s = nchar(unlist(strsplit(as.character(x),".",fixed = TRUE)))
  if(as.numeric(x) < 1) s[1] <- s[1]-1
  setNames(as.list(s),c("fixed","decimal"))
}

CORRECT:

fun(10.234)
$fixed
[1] 2

$decimal
[1] 3

fun(-10.234)
$fixed
[1] 2

$decimal
[1] 3

fun(0.2346)
$fixed
[1] 0

$decimal
[1] 4

> fun(-0.2346)
$fixed
[1] 0

$decimal
[1] 4

INCORRECT: Note that fixed + decimal <=15!!!

fun(-10000567.2346678901876)
$fixed
[1] 8

$decimal
[1] 7 ## This is incorrect

你似乎有点希望这能实现。好吧,这里有一个粗略的方法:

fun <- function(x){
  stopifnot(is.numeric(as.numeric(x)))
  s = nchar(unlist(strsplit(as.character(x),".",fixed = TRUE)))
  if(as.numeric(x) < 1) s[1] <- s[1]-1
  setNames(as.list(s),c("fixed","decimal"))
}

CORRECT:

fun(10.234)
$fixed
[1] 2

$decimal
[1] 3

fun(-10.234)
$fixed
[1] 2

$decimal
[1] 3

fun(0.2346)
$fixed
[1] 0

$decimal
[1] 4

> fun(-0.2346)
$fixed
[1] 0

$decimal
[1] 4

INCORRECT: Note that fixed + decimal <=15!!!

fun(-10000567.2346678901876)
$fixed
[1] 8

$decimal
[1] 7 ## This is incorrect


假设你有一个向量,我的输入不是向量。我有一个数字作为输入。例如,对于12,我希望看到fixed=2和dcimal=0,对于12.657,我希望看到fixed=2和decimal=3,最后对于12.1,我希望看到fixed=2和decimal=1作为输入,输出。它是数字格式还是stringWith function as.character我们可以将一个数字转换成一个字符串,然后使用该字符串。这是次要的,但是“我的输入不是一个向量”可能是短视的:让你的函数预先处理单个值和任意长度的向量,这个函数的性能会显著提高,并能适应更多的情况。(当它应该预先向量化时,总是使用
sapply
会让人厌烦。)假设你有一个向量
v1,我的输入不是向量。我有一个数字作为输入。例如:对于12,我希望看到fixed=2和dcimal=0,对于12.657,我希望看到fixed=2和decimal=3,最后对于12.1,我希望在输出中看到fixed=2和decimal=1。它是数字格式还是stringWith functtion as.character我们可以将数字转换为字符串,然后使用字符串。这是次要的,但“我的输入不是向量”可能是短视的:让您的函数预先处理任意长度的单个值和向量,此函数的性能将显著提高,并可适应更多情况。(一直使用
sapply
可能会让人厌烦,因为它本应该在前面进行矢量化。)此函数无法工作,因为它没有使用参数
x
。当我使用
1/3
时,我得到
固定值:1和十进制值:15
。但是当我使用
打印(1/3,数字=16)进行检查时
和-显然-我没有得到
0.333333 0
,但是
0.3333
有16个3。
1/3
的真实结果是什么?我不想检查像1/3或1/7这样的分数的函数。我需要像1.323、0.3或12.34这样的浮点数的函数。我指的是具有特定数字d的数ecimals@vahid那么这应该对你有用。祝你好运!@vahid这是因为我使用了
message()
函数。如果你需要将输出用作对象(或者如果你喜欢黑色输出),你可以将其更改为
print()
函数。我假设是sinc