Sylvanas
浮点数的问题,读取的“18.8”和计算得到的“18.8”实际上并不是完全一致的。
x <- readxl::read_xlsx("example.xlsx")
tmp <- fivenum(x$age49RBC)
tukey_critical <- tmp[4] + 1.5 * (tmp[4] - tmp[2])
identical(x$age49RBC[670], 18.8)
#> [1] TRUE
identical(tukey_critical, 18.8)
#> [1] FALSE
format(x$age49RBC[670], digits = 22)
#> [1] "18.80000000000000071054"
format(tukey_critical, digits = 22)
#> [1] "18.79999999999999715783"
<sup>Created on 2024-11-06 with reprex v2.1.1</sup>
0.8 这个小数本身是不能被二进制精确表示的。就算可以,计算tukey边界的过程中的数也不一定都能被精确表示,所以有可能产生这种因为浮点精度导致的问题。可以看到对于计算机而言,你数据中那个“18.8”,确实是大于你计算得到的那个边界的“18.8”。
如果这个比较非常有必要,并且你对于自己的数据的精度要求本身是比较明确的,可以考虑用signif()
来给定一个精度再进行比较。虽然始终无法在计算机中精确表示0.8,但作为此处的比较的目的应该足够了。
> format(signif(tukey_critical, digits = 10), digits = 22)
# [1] "18.80000000000000071054"
> format(signif(x$age49RBC[670], digits = 10), digits = 22)
# [1] "18.80000000000000071054"
> identical(signif(x$age49RBC[670], digits = 10), signif(tukey_critical, digits = 10))
# [1] TRUE
可以参考这篇关于浮点数比较的blog