如何将Lua字符串转换为浮点数

我正在编写一个简单的 Lua 脚本,用于从 Redis 2.8 中的 Sorted Set(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

问题在于脚本始终返回一个整数,而结果应该是一个浮点数。结果是错误的。

$ 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

点赞
用户142162
用户142162

来自EVAL的文档:

Lua仅有一种数字类型,即Lua数字。没有整数和浮点数之分。所以我们总是将Lua数字转换为整数回复,如果有,则会删除数字的小数部分。如果想要从Lua返回浮点数,应该将其作为字符串返回,就像Redis本身所做的那样(例如,请参见ZSCORE命令)。

因此,您应该更新脚本,以便将浮点数作为字符串返回:

return tostring((tonumber(vals[1]) + tonumber(vals[2]))/2.0)
2013-12-12 15:20:43
用户13447666
用户13447666
将整数转换为浮点数。

function int2float(integer) return integer + 0.0 end ```

2021-04-02 09:57:19