我正在处理Lua中的时间戳,显示自Epoch以来的微秒数(例如"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 Copyright (C) 1994-2008 Lua.org, PUC-Rio > a = 1e17/3 > print(string.format("%f",a)) 33333333333333332.000000 > print(string.format("%e",a)) 3.333333e+016 > print(string.format("%.0f",a)) 33333333333333332
请注意,如果值适合32位有符号整数范围,您也可以使用该%d
格式.但是,如果值超出该范围,则结果不明确.系统时间戳(以微秒为单位)可能超过32位范围.
如果16位十进制数字的精度不够,可以选择几种方法来提高精度.
首先,将一个真正的64位整数userdata
与一组合适的算术元方法打包在一起并不困难.这在Lua邮件列表上偶尔会讨论,但我不记得看到任何人发布完整的模块.
其次,Lua的一位作者发布了两个支持任意精度算术的模块:lbc和lmapm.两者都在该页面上找到.
第三,随意搜索谷歌很容易找到其他几个数学库包装.