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

时间:2018-08-21 14:45:43

标签: r

我正在尝试创建一个简单的函数,以我的规范在1.05.0之间舍入小数。在这种情况下,输入数字用

  • 小于0.3的小数元素应四舍五入为(floor
  • 大于0.7的小数元素应四舍五入(ceiling
  • 0.30.7之间的
  • 小数元素应四舍五入为0.5

我具有以下功能,但行为怪异。查看我发布的示例。 1c(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

2 个答案:

答案 0 :(得分:2)

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

由于无论如何您将输入格式设置为单个十进制数字,因此您也可以针对模数进行输入

Listing

答案 1 :(得分:0)

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

instanceof  T