我正在处理 Lua 中的时间戳,显示自纪元以来的微秒数(例如“1247687475123456”)。
我真的很想能够打印出那个可怕的数字,但是 Lua 坚持用科学计数法打印它。我已经搜索了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学记数法打印 (%e/%E)”和“如果数字很长 (%g),则自动以科学记数法打印” . 似乎没有可用的选项以正常形式打印该数字。
我意识到我可以编写一个函数来获取原始数字,除以 10 并循环打印数字,但这似乎很麻烦。当然有某种内置于语言中的方法吗?
我正在处理 Lua 中的时间戳,显示自纪元以来的微秒数(例如“1247687475123456”)。
我真的很想能够打印出那个可怕的数字,但是 Lua 坚持用科学计数法打印它。我已经搜索了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学记数法打印 (%e/%E)”和“如果数字很长 (%g),则自动以科学记数法打印” . 似乎没有可用的选项以正常形式打印该数字。
我意识到我可以编写一个函数来获取原始数字,除以 10 并循环打印数字,但这似乎很麻烦。当然有某种内置于语言中的方法吗?
> print(string.format("%18.0f",1247687475123456))
1247687475123456
通常配置的 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 中随意搜索很容易找到其他几个数学库包装器。