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

Function to Convert decimals to percentage in KDB

`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%

`pct:157.35686

错误,因为您没有分配变量。

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

应该适合你的情况。我也删除了函数的全局分配。

你对 Vector Conditional ? 的使用表明你的论点可能是一个向量†。

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

样本答案是 rounded down 到小数点后两位。

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

示例答案以百分号为后缀:将它们转换为字符串。将 Join 投影到 "%" 上以导出一元 ,[;"%"],您可以将其应用于 each.

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

† 对于原子参数,使用“三元条件”控制结构 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 是一个运算符,它的所有三个参数都会被求值。也就是说,无论 x>1 的结果如何, x-100x*100 都会被评估。使用 Cond,计算第二个或第三个表达式;从来没有。

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