在R中将乘法转换为整数时的奇怪行为

时间:2019-03-27 14:54:04

标签: r type-conversion integer behavior

在R中将50 * 0.58转换为整数时,它得到28而不是29

我尝试了R的两个版本,即3.4.4和3.5.1。两者都表现出相同的行为,我将尝试在下面进行解释:

这给出29:

50 * .58
[1] 29

但是,它给出28:

as.integer(50 * .58)
[1] 28

我写了一个小函数来进一步测试:

int_test <- function(x){

  cat("number is", x, "integer is", as.integer(50 * x), "\n") 
}

当我从0.02到1给出正确答案(29)

sapply(seq(from = 0.02, by = 0.02, to = 1), int_test)

数字是0.48整数是24

数字是0.5整数是25

数字是0.52整数是26

数字是0.54整数是27

数字是0.56整数是28

数字是0.58整数是29

数字是0.6整数是30

数字是0.62整数是31

数字是0.64整数是32

数字是0.66整数是33

数字是0.68整数是34

但是,当我从0.5变为0.8时,又是28

invisible(sapply(seq(from = 0.5, by = 0.02, to = .8), int_test))

数字是0.5整数是25

数字是0.52整数是26

数字是0.54整数是27

数字是0.56整数是28

数字是0.58整数是28

数字是0.6整数是30

数字是0.62整数是31

数字是0.64整数是32

数字是0.66整数是33

数字是0.68整数是34

数字是0.7整数是35

数字是0.72整数是36

数字是0.74整数是37

数字是0.76整数是38

数字是0.78整数是39

数字是0.8整数是40

这是我的sessionInfo:

> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

Matrix products: default
BLAS/LAPACK: /software/sse/easybuild/prefix/software/OpenBLAS/0.2.20-GCC-6.4.0-2.28/lib/libopenblas_haswellp-r0.2.20.so

locale:
 [1] LC_CTYPE=sv_SE.UTF-8 LC_NUMERIC=C         LC_TIME=C           
 [4] LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C       
 [7] LC_PAPER=C           LC_NAME=C            LC_ADDRESS=C        
[10] LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C 

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.5.1

有人知道这里发生了什么吗?

0 个答案:

没有答案