我正在处理Lua中的时间戳,显示自Epoch以来的微秒数(例如“1247687475123456”)。
我真的喜欢能够将这个号码印在所有可怕的荣耀中,但Lua坚持用科学记谱法打印它。我已经搜索了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学记数法打印(%e /%E)”和“如果数字很长(%g),则以科学记数法自动打印” 。似乎没有选项以正常形式打印数字。
我意识到我可以写一个能取原始数字的函数,做一些除以10并在循环中打印数字,但这似乎是一个不优雅的麻烦。当然有一些方法可以做到这种内置于语言中的方法吗?
答案 0 :(得分:16)
> print(string.format("%18.0f",1247687475123456))
1247687475123456
答案 1 :(得分:7)
通常配置的Lua使用平台通常的双精度浮点格式来存储所有数字。对于今天大多数桌面平台,这将是64位IEEE-754格式。 conventional wisdom是可以安全地假设-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位十进制数字的精度不够,可以选择多种方法来提高精度。
首先,在userdata
中打包一个真正的64位整数以及一组合适的算术元方法并不困难。这会偶尔在Lua mailing list上讨论,但我不记得看到任何人发布完整的模块。
其次,Lua的一位作者发布了两个支持任意精度算术的模块:lbc and lmapm。两者都在该页面上找到。
第三,在谷歌进行随意搜索很快就会出现其他几个数学库包装器。