Redis 不保留排序集中的精度

Ami*_*ule 0 redis

我正在尝试使用 Redis 精确创建一个记分板。但它正在四舍五入精度。

例如

127.0.0.1:6379> zadd leaderboard 30.1441050792000 "item"
(integer) 1
127.0.0.1:6379> zrevrange leaderboard 0 -1 withscores
1) "item"
2) "30.144105079199999"
Run Code Online (Sandbox Code Playgroud)

有没有办法保持redis的精度来存储准确的结果。

谢谢

sbe*_*rry 6

根据文档

Redis 排序集使用双 64 位浮点数来表示分数。在我们支持的所有架构中,这表示为 IEEE 754 浮点数

因此,如果您需要那么高的精度,您可以存储 0 - 2^53 范围内的整数。然后,您可以在读取数据时除以乘数。

例子:

127.0.0.1:6379> zadd leaderboard 301441050792000 item
(integer) 1
127.0.0.1:6379> zrevrange leaderboard 0 -1 WITHSCORES
1) "item"
2) "301441050792000"
Run Code Online (Sandbox Code Playgroud)

然后除以 1e13 即可。

注意
此选项适用的最大值为 900.7199254740992。之后,您会超过 53 位,最终会失去精度。