Hi All,
Here is the information i want to share,
To round of up to any decimal place,Use below formula
Formula ----> n*floor 0.5+m*AnyFloatValue
Eg.
One decimal place:
n = 1/10 = 0.1
m = 1*10 = 10
Expression Example ----> 0.1*floor 0.5+10*34.45
Output -----> 34.5f
Two decimal place:
n = 1/100 = 0.01
m = 1*100 = 100
Expression Example ----> 0.01*floor 0.5+100*34.456
Output -----> 34.46f
Nick10
April 19, 2016, 4:01pm
2
you can find this functionality in the ‘.util.rnd’ function provided in the code that accompanies “Q Tips: Fast, Scalable and Maintainable Kdb+”: http://q-tips.net
https://github.com/psaris/qtips/blob/master/util.q
.util.rnd:{x*“j”$y%x}
q).util.rnd[.1]34.45
34.5
q).util.rnd[.01]34.456
34.46
note: you can cast the number instead of adding .5 and taking the floor
If you need to be as accurate as possible, I’d suggest using division
rather than multiplication after the casting:
q)rnd:{x*“j”$y%x}
q)rnd2:{(“j”$x*y)%x}
q)0=1.4-rnd[0.1;1.41]
0b
q)0=1.4-rnd2[10;1.41]
1b
Nick10
April 20, 2016, 12:50pm
4
be careful when relying on exact comparisons with floats. a slight change to the inputs, might have unexpected results.
q)rnd2[10;4.1]
4.0999999999999996
q)rnd2[10;1#4.1]
,4.1000000000000005
q optimizes division of a vector by scalar. it first taking the reciprocal of the scalar and then multiplies.
q)41%10
4.0999999999999996
q)enlist[41]%10
,4.1000000000000005
q)41*1%10
4.1000000000000005
if you need exact values, it is better to store (and round) your data as integers