如题,本菜鸟最近在学习 data.table 包,关于 getNumericRounding()
这个函数没看懂。在此函数的例子中有这样一段。
DT = data.table(a=seq(0,1,by=0.2),b=1:2, key="a")
DT
setNumericRounding(0) # By default, rounding is turned off
DT[.(0.4)] # works
DT[.(0.6)]
setNumericRounding(2) # round off last 2 bytes
DT[.(0.6)] # works
将十进制的0.6转换为二进制,会得到0.10011001···,一个由1001组成的无限循环小数。在不舍入的情况下,0.6是个无限循环小数,后台存储的字节数有限,因此存储的二进制并不等于真正的十进制0.6。
|小数部分乘以2|结果|取整数部分|位数|
|:---😐:---😐:---😐:---😐
|0.62|1.2|1|0|
|0.22|0.4|0|1|
|0.42|0.8|0|2|
|0.82|1.6|1|3|
|0.6*2|1.2|1|4|
|···|···|···|···|
由于不清楚data.table包里面二进制的舍入规则具体是什么样,所以也看不懂执行setNumericRounding(2)
后到底是改变了什么,也就没懂DT[.(0.6)]
前后到底为撒不一样。