9
Redis 2.8のSorted Set(http://redis.io/commands/#sorted_set)から中央値を計算する簡単なLuaスクリプトを作成しています。スクリプトは次のとおりですLua文字列を浮動小数点数に変換する方法
local cnt = redis.call("ZCARD", KEYS[1])
if cnt > 0 then
if cnt%2 > 0 then
local mid = math.floor(cnt/2)
return redis.call("ZRANGE", KEYS[1], mid, mid)
else
local mid = math.floor(cnt/2)
local vals = redis.call("ZRANGE", KEYS[1], mid-1, mid)
return (tonumber(vals[1]) + tonumber(vals[2]))/2.0
end
else
return nil
end
問題は、結果が浮動小数点型である必要がある場合、常に整数を返します。結果は間違っています。
$ redis-cli zrange floats 0 100
1) "1.1"
2) "2.1"
3) "3.1"
4) "3.4975"
5) "42.63"
6) "4.1"
$ redis-cli EVAL "$(cat median.lua)" 1 floats
(integer) 3
正しい結果が(3.1 + 3.4975)であるべきである/2.0 == documentation for EVAL
から3.298
ありがとう! "私たちは常にルアの数字を整数の返信に変換し、数字の小数部分を取り除いています" - その理由は何か、完全に直感的ではないと思いますか? – Adil
私は、整数はレディスの浮動小数点数よりも一般的なユースケースだと思います。 – Azmisov