【问题标题】:Time in nanoseconds in lua script for RedisRedis 的 lua 脚本中的时间(以纳秒为单位)
【发布时间】:2021-04-06 20:52:21
【问题描述】:

我正在 redis 中运行一个 lua 脚本,如下所示:

eval "return tostring(tonumber(ARGV[1]))" 0 1538409827183989630

应该返回1538409827183989630,但返回的是1.538409827184e+18,它正在删除最后几个纳秒数字(它的时间戳以纳秒为单位)

假设我需要纳秒精度因为我正在比较时间戳,那么正确的方法是什么..

【问题讨论】:

  • ARGV[1] 是什么类型?在将其转换为字符串之前,是否真的有必要将其转换为数字?如果你想要一个特定的格式,你应该使用string.format 明确地格式化你的字符串
  • 是的,我需要把它转换成整数做比较(上面的例子中没有显示,因为它是不相关的)然后作为字符串返回

标签: redis lua


【解决方案1】:

Lua 数字有两种子类型,整数和浮点数,Lua 会自动选择。

当您想要将数字转换为字符串时,您必须关心这种差异的少数情况(如果不是唯一的话)之一。

print(1538409827183989630) 将打印1538409827183989630

print(1538409827183989630.0) 将打印为1.538409827184e+18

如果您想确保获得相同的输出,则必须明确格式化字符串。

local int = 1538409827183989630
local float = 1538409827183989630.0

print(string.format("%d", int))
print(string.format("%d", float))

输出:

1538409827183989630
1538409827183989504

您会注意到,由于浮点->整数转换,两个数字之间会有差异。

【讨论】:

  • 我觉得 tonumber() 总是返回一个浮点数,所以我总是坚持使用 1538409827183989504 将它转换为整数的其他选项是什么?
  • 如果字符串表示整数,tonumber 将返回一个整数。要将浮点数转换为整数,您可以使用 math.floor()
  • 然后我很困惑这段代码 eval "return string.format(\"%d\",tonumber(ARGV[1]))" 0 1538409827183989630 仍然打印 1538409827183989504
  • 您不能将该整数的所有数字存储在浮点数中。请阅读有关数据类型以及整数和浮点数之间的区别
  • 老兄,我知道其中的区别,我猜你无法理解 tonumber 即使我传递一个整数 1538409827183989630 或只是向我展示从字符串中打印这个 1538409827183989630 整数的代码,它也会给我一个浮点数使用 tonumber 转换为数字
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2017-06-28
  • 2019-01-09
相关资源
最近更新 更多