Redis Lua - 处理Long.MAX_VALUE时eval返回错误值

127.0.0.1:7501> eval "return {1,2,9223372036854775807}" 0

  1. (integer) 1

  2. (integer) 2

  3. (integer) -9223372036854775808

请帮忙解决这个奇怪的行为。我知道Lua只能表示大于10^15的大数字,但会失去一些精度。 我本应该期望返回值为“9.2233720368548e+18”,但并不是一个负数。

同时,知道 127.0.0.1:7501> eval "return {1,2,tostring(9223372036854775807)}" 0

  1. (integer) 1

  2. (integer) 2

  3. "9.2233720368548e+18"

127.0.0.1:7501> eval "return {1,2,tonumber(9223372036854775807)}" 0

  1. (integer) 1

  2. (integer) 2

  3. (integer) -9223372036854775808

点赞
用户3160475
用户3160475

从文档页面中提取(https://redis.io/commands/eval):

Lua只有一种数值类型,即Lua数字。没有整数和浮点数之间的区别。因此,我们总是将Lua数字转换为整数回复,如果有小数部分,则去掉小数部分。如果您想从Lua返回一个浮点数,您应该将它返回为字符串,就像Redis本身所做的那样(例如,查看ZSCORE命令)。

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

2017-12-13 00:49:53