redis lua - eval 在处理 Long.MAX_VALUE 时返回错误值

sum*_*232 0 lua redis jedis lettuce stackexchange.redis

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> eval "return {1,2,tostring(9223372036854775807)}" 0
1) (整数) 1
2) (整数) 2
3) "9.2233720368548e+18"

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

Ita*_*ber 5

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

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

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