【问题标题】:redis lua - eval returns wrong value when dealing with Long.MAX_VALUEredis lua - eval 在处理 Long.MAX_VALUE 时返回错误值
【发布时间】:2018-05-26 17:58:09
【问题描述】:

127.0.0.1:7501> eval "返回 {1,2,9223372036854775807}" 0
1) (整数) 1
2) (整数) 2
3)(整数)-9223372036854775808

请帮助这种奇怪的行为。我知道 lua 只能表示超过 10^15 的大数,因为它会失去一些精度。 我本来期望返回值为“9.2233720368548e+18” 但不是负数。

也仅供参考 127.0.0.1:7501> 评估“返回 {1,2,tostring(9223372036854775807)}”0
1) (整数) 1
2) (整数) 2
3)“9.2233720368548e+18”

127.0.0.1:7501> eval "返回 {1,2,tonumber(9223372036854775807)}" 0
1) (整数) 1
2) (整数) 2
3)(整数)-9223372036854775808

【问题讨论】:

    标签: lua redis stackexchange.redis jedis lettuce


    【解决方案1】:

    取自文档页面 (https://redis.io/commands/eval):

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

    您使用的数字 (~10^19) 太大而无法在 Lua 中表示为整数,因此它变成了浮点数。 Redis类型转换为整数时,溢出,变成负值。

    【讨论】:

    • 请问,为什么会溢出,当双精度中的符号位为正时,返回到redis时。
    • 整数和浮点编码是不同的,这种类型转换默认为整数,除非明确使用tostring。使用 FP 编码作为有符号整数的表示会产生意想不到的结果。
    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2016-10-21
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多