比较时,格式化的round()函数输出不等于实际值

比较时,格式化的round()函数输出不等于实际值,r,R,我试图用我的规范制作一个简单的函数,将小数从1.0四舍五入到5.0。在这种情况下,输入的数字为 小于0.3的十进制元素应四舍五入为0(floor) 大于0.7的十进制元素应向上舍入(上限) 介于0.3和0.7之间的十进制元素应四舍五入为0.5 我有以下函数,但它的行为怪异。查看我发布的示例。对于1和c(2,3,4),它的行为不同 这确实可能是由于浮点数的表示。在内部,2.7%%2可以表示为2.70000000001 由于您可以将输入格式化为单个十进制数,因此也可以对模数进行格式化 my_ro

我试图用我的规范制作一个简单的函数,将小数从
1.0
四舍五入到
5.0
。在这种情况下,输入的数字为

  • 小于
    0.3
    的十进制元素应四舍五入为0(
    floor
  • 大于0.7的十进制元素应向上舍入(
    上限
  • 介于
    0.3
    0.7
    之间的十进制元素应四舍五入为
    0.5
我有以下函数,但它的行为怪异。查看我发布的示例。对于
1
c(2,3,4)
,它的行为不同


这确实可能是由于浮点数的表示。在内部,2.7%%2可以表示为2.70000000001

由于您可以将输入格式化为单个十进制数,因此也可以对模数进行格式化

my_roundup <- function(x) {
  x <- as.numeric(format(x, digits = 2))
  stopifnot(x >= 1.0 & x <= 5.0) 
  floor(x) + (round(x %% 1,1) > 0.3)*0.5 + (round(x %% 1,1) > 0.7)*0.5
}
my_综述0.7)*0.5
}

以下是该函数的一个更简单版本:

my_roundup <- function(x) {
temp <- ifelse(round(x%%floor(x),1) < 0.3, 0, ifelse(round(x%%floor(x),1) <=0.7, 0.5, 1))
return(floor(x) + temp)
}

我的综述我认为这是一个。看到
(1:4+0.3)%%1-0.3
,您可能会想到
0
,这可能是有用的。可能是重复的,并且
(1:4+0.3)%%1根据@MKBakker的评论编辑了它。谢谢,这正是我需要的。
my_roundup <- function(x) {
  x <- as.numeric(format(x, digits = 2))
  stopifnot(x >= 1.0 & x <= 5.0) 
  floor(x) + (round(x %% 1,1) > 0.3)*0.5 + (round(x %% 1,1) > 0.7)*0.5
}
my_roundup <- function(x) {
temp <- ifelse(round(x%%floor(x),1) < 0.3, 0, ifelse(round(x%%floor(x),1) <=0.7, 0.5, 1))
return(floor(x) + temp)
}