在KDB中将小数转换为百分比的函数

Function to Convert decimals to percentage in KDB

提问人:coderinq 提问时间:2/24/2022 更新时间:2/24/2022 访问量:252

问:

`pct:157.35686
func[`pct]
func::{[x]
    ?[x>1;x-100;100*x]}

结果应为 57.35%

`pct:0.804892
func[`pct]
func::{[x]
    ?[x>1;x-100;100*x]}

结果应为 80.48%

KDB Q

评论

0赞 SJT 2/24/2022
看起来您还希望结果四舍五入到小数点后两位。
0赞 Matt Moore 2/25/2022
SJT 和 Maurice 已经覆盖了你,但我不明白你的逻辑。如果都是小数点后,我会认为.250 会是多少?150%?pct157.35 = 15735%
0赞 Maurice Lim 2/25/2022
是的,功能和问题很奇怪。要将小数转换为百分比,您只需要将小数乘以 100 并(格式化)添加一个 % 符号,就像 Matt 建议的那样。如果我正确地理解了您要做什么,那么对于超过 100 的数字,您可能需要 x mod 100 之类的东西?
0赞 coderinq 3/7/2022
是的,@MauriceLim,x mod 100 可以工作,但是,我的但结果应该是 37.57% 而不是 37.5792% 精确度,最多只有小数点后 2 位pct[137.5792] pct:{[x] ?[x>=100;x mod 100;x*100]}
0赞 Maurice Lim 3/8/2022
将其转换为 2DP 的@coderinq - 您可以将其与 SJT 的答案或 stackoverflow.com/questions/68759384/ 结合使用...... 提供了一个很好的解决方案

答:

1赞 Maurice Lim 2/24/2022 #1
`pct:157.35686

是错误的,因为您没有赋值变量。

func:{[x]
    ?[x>1;x-100;100*x]}
pct:0.804892
func[pct]
pct:157.35686
func[pct]

应该适用于您的情况。我还删除了该函数的全局赋值。

2赞 SJT 2/24/2022 #2

你对向量条件的使用表明你的参数可能是一个向量†。?

q){?[x>1;x-100;x*100]} 157.35686 0.804892
57.35686 80.4892

样本答案四舍五入到小数点后两位。

q).01 xbar {?[x>1;x-100;x*100]} 157.35686 0.804892
57.35 80.48

样本答案以百分号为后缀:将它们转换为字符串。项目 Join onto 以派生一元,您可以使用 应用。"%",[;"%"]each

q),[;"%"] each string .01 xbar {?[x>1;x-100;x*100]}157.35686 0.804892
"57.35%"
"80.48%"

† 对于 atom 参数,请使用“三元条件”控制结构 Cond

q){$[x>1;x-100;x*100]}157.35686
57.35686
q){$[x>1;x-100;x*100]}0.804892
80.4892

为什么?因为 Vector Conditional 是一个运算符,并且它的所有三个参数都经过计算。也就是说,无论结果如何,两者都被评估。使用 Cond,计算第二个或第三个表达式;永远不要两者兼而有之。x>1x-100x*100

在这个例子中,成本当然可以忽略不计。在其他情况下,第二个和第三个参数中的表达式可能很昂贵。