我如何在 KDB 中舍入数字?

How do I round numbers in KDB?

看起来我可以将 floorceiling 破解成任意 round 的元函数,但是有没有标准的方法可以做到:

round[3.1415;2] = 3.14

来自核心功能?

编辑:这是我要解决的问题:

我有未经调整的每日库存数据,我正在尝试识别拆分并过滤掉它们。它因十进制人工制品而变得更加复杂(拆分可能不完美 2:1 因为价格具有最小刻度大小)。

这可以通过使用 .Q.f 实现,但是 return 输出为字符串。

使用这个我们可以将 3.14159 舍入到小数点后两位,如下所示:

q) .Q.f[2;] 3.14
"3.14"
q)round:{"F"$.Q.f[y]x}
q)round[3.1415;2]
3.14

没有标准方法,因为在 kdb 中,您真的不需要舍入浮点数。圆形花车的原因是什么?如果它只是为了漂亮的打印显示,那么您可以使用像 Matthew 建议的方法,但底层 kdb 逻辑不需要它。

如果必须,您可以使用您已经想到的 floor/ceiling,或者您可以使用转换为 interger/long 实现的内置最近舍入。例如

q)d:{("j"$x*y)%x}
q)d2:d[100]
q)d3:d[1000]
q)
q)a:5?10.0
q)
q)d2 a
3.92 0.81 9.37 2.78 2.39
q)d3 a
3.915 0.812 9.368 2.782 2.392

但即使在这里您也应该意识到这完全是虚构的舍入,因为您仍在使用浮点数并且仍然会受到浮点模糊性的影响。如果我增加精度值,上面相同的结果是:

q)\P 18
q)
q)d2 a
3.9199999999999999 0.81000000000000005 9.3699999999999992 2.7799999999999998 ..
q)d3 a
3.915 0.81200000000000006 9.3680000000000003 2.782 2.3919999999999999

拥有真正具体的小数位数的唯一方法是将整数存储为 ints/longs 并将小数单独存储为 ints/longs