16

我正在处理 Lua 中的时间戳,显示自纪元以来的微秒数(例如“1247687475123456”)。

真的很想能够打印出那个可怕的数字,但是 Lua 坚持用科学计数法打印它。我已经搜索了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学记数法打印 (%e/%E)”和“如果数字很长 (%g),则自动以科学记数法打印” . 似乎没有可用的选项以正常形式打印该数字。

我意识到我可以编写一个函数来获取原始数字,除以 10 并循环打印数字,但这似乎很麻烦。当然有某种内置于语言中的方法吗?

4

2 回答 2

22
> print(string.format("%18.0f",1247687475123456))

1247687475123456

于 2009-07-15T20:19:25.987 回答
8

通常配置的 Lua 使用您平台的常用双精度浮点格式来存储所有数字。对于当今的大多数桌面平台,这将是 64 位 IEEE-754 格式。传统观点是,可以安全地假设 -1E15 到 +1E15 范围内的整数可以精确表示。

在任何情况下,该string.format()函数都会将其参数通过(稍作调整)传递给平台的printf(). 可以理解的格式字符串printf()包括%e%E强制“科学”表示法,并%f强制使用普通十进制表示法。另外,%g%G选择最短的符号。

例如:

E:\...>lua
Lua 5.1.4 版权所有 (C) 1994-2008 Lua.org, PUC-Rio
> a = 1e17/3
> 打印(string.format("%f",a))
33333333333333332.000000
> 打印(字符串.格式(“%e”,a))
3.333333e+016
> 打印(string.format("%.0f",a))
33333333333333332

请注意,如果该值适合 32 位有符号整数范围,您也可以使用该%d格式。但是,如果值超出该范围,则结果无法很好地定义。以微秒为单位的系统时间戳可能会超过 32 位范围。

如果 16 位十进制数字不够精确,则有多种选择可用于提高精度。

首先,将真正的 64 位整数userdata与一组合适的算术元方法一起打包并不难。Lua 邮件列表中偶尔会讨论这个问题,但我不记得看到任何人发布了完整的模块。

其次,Lua 的一位作者发布了两个支持任意精度算术的模块:lbc 和 lmapm。两者都可以在该页面上找到。

第三,在 Google 中随意搜索很容易找到其他几个数学库包装器。

于 2009-07-15T21:04:33.943 回答