我正在尝试创建一个简单的函数,以我的规范在1.0
到5.0
之间舍入小数。在这种情况下,输入数字用
0.3
的小数元素应四舍五入为(floor
)0.7
的小数元素应四舍五入(ceiling
)0.3
和0.7
之间的0.5
我具有以下功能,但行为怪异。查看我发布的示例。 1
和c(2, 3, 4)
的行为不同。
my_roundup <- function(x) {
x <- as.numeric(format(x, digits = 2))
stopifnot(x >= 1.0 & x <= 5.0)
floor(x) + (x %% 1 > 0.3)*0.5 + (x %% 1 > 0.7)*0.5
}
# e.g
my_roundup(x = 1.3) # 1.5
my_roundup(x = 2.3) # 2
my_roundup(x = 3.3) # 3
my_roundup(x = 4.3) # 4
最终输出如下。我已经用####
插入了预期的行。谁能告诉我我做错了什么?
(x <- seq(1, 5, 0.1))
cbind(actual = x, converted = my_roundup(x))
actual converted
[1,] 1.0 1.0
[2,] 1.1 1.0
[3,] 1.2 1.0
##### 1.3 1.0
[4,] 1.3 1.5
[5,] 1.4 1.5
[6,] 1.5 1.5
[7,] 1.6 1.5
[8,] 1.7 1.5
[9,] 1.8 2.0
[10,] 1.9 2.0
[11,] 2.0 2.0
[12,] 2.1 2.0
[13,] 2.2 2.0
[14,] 2.3 2.0
[15,] 2.4 2.5
[16,] 2.5 2.5
[17,] 2.6 2.5
##### 2.7 2.5
[18,] 2.7 3.0
[19,] 2.8 3.0
[20,] 2.9 3.0
[21,] 3.0 3.0
[22,] 3.1 3.0
[23,] 3.2 3.0
[24,] 3.3 3.0
[25,] 3.4 3.5
[26,] 3.5 3.5
[27,] 3.6 3.5
##### 3.7 3.5
[28,] 3.7 4.0
[29,] 3.8 4.0
[30,] 3.9 4.0
[31,] 4.0 4.0
[32,] 4.1 4.0
[33,] 4.2 4.0
[34,] 4.3 4.0
[35,] 4.4 4.5
[36,] 4.5 4.5
[37,] 4.6 4.5
##### 4.7 4.5
[38,] 4.7 5.0
[39,] 4.8 5.0
[40,] 4.9 5.0
[41,] 5.0 5.0
答案 0 :(得分:2)
这确实有可能是由于浮点数的表示。在内部,2.7 %% 2可能表示为2.7000000000001
由于无论如何您将输入格式设置为单个十进制数字,因此您也可以针对模数进行输入
Listing
答案 1 :(得分:0)
以下是该函数的简单版本:
instanceof T