如何将Lua字符串转换为float

时间:2013-12-12 12:21:42

标签: lua redis

我正在编写一个简单的Lua脚本来计算Redis 2.8中排序集(http://redis.io/commands/#sorted_set)的中位数。脚本在

下面
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

问题是当结果应该是float时,脚本总是返回一个整数。结果是错误的。

$ 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 == 3.298

2 个答案:

答案 0 :(得分:13)

来自documentation for EVAL

  

Lua有一个数字类型,Lua数字。整数和浮点数之间没有区别。所以我们总是将Lua数转换成整数回复,删除数字的小数部分(如果有的话)。 如果你想从Lua返回一个浮点数你应该把它作为字符串返回,就像Redis本身一样(参见例如ZSCORE命令)。

因此,您应该更新脚本,以便返回float as a string

return tostring((tonumber(vals[1]) + tonumber(vals[2]))/2.0)

答案 1 :(得分:0)

对不起,我没有解释这个是我在制作脚本时偶然遇到的

function int2float(integer)
  return integer + 0.0
end