【问题标题】:How to convert a Lua string to float如何将 Lua 字符串转换为浮点数
【发布时间】:2013-12-30 20:40:03
【问题描述】:

我正在编写一个简单的 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

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

$ 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

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    来自documentation for EVAL

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

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

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

    【讨论】:

    • 谢谢! “所以我们总是将 Lua 数字转换为整数回复,删除数字的小数部分” - 有什么理由,听起来完全违反直觉。
    • 我猜整数是比 redis 中的浮点数更常见的用例。
    【解决方案2】:

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

    function int2float(integer)
      return integer + 0.0
    end
    

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 1970-01-01
      • 2018-02-15
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多