如果不使用科学记数法,如何在Lua中打印大量数字?

如果不使用科学记数法,如何在Lua中打印大量数字?,lua,scientific-notation,Lua,Scientific Notation,我正在处理Lua中的时间戳,它显示了自纪元以来的微秒数(例如“1247687475123456”) 我真的很想把这个数字打印出来,但卢阿坚持用科学记数法。我已经浏览了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学表示法打印(%e/%e)”和“如果数字很长(%g)”,则自动以科学表示法打印”。似乎没有可用的选项以正常形式打印数字 我意识到我可以编写一个函数,将原始数字除以10,然后在循环中打印数字,但这似乎是一个不雅观的麻烦。语言中肯定有某种方法可以做到这一点 > print(s

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

我真的很想把这个数字打印出来,但卢阿坚持用科学记数法。我已经浏览了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学表示法打印(%e/%e)”和“如果数字很长(%g)”,则自动以科学表示法打印”。似乎没有可用的选项以正常形式打印数字

我意识到我可以编写一个函数,将原始数字除以10,然后在循环中打印数字,但这似乎是一个不雅观的麻烦。语言中肯定有某种方法可以做到这一点

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

1247687475123456

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

在任何情况下,函数都会将其参数传递给平台的实现。
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 E:\…>lua Lua 5.1.4版权所有(C)1994-2008 Lua.org,临市局里约 >a=1e17/3 >打印(字符串格式(“%f”,a)) 33333333333333332.000000 >打印(字符串格式(“%e”,a)) 3.333 E+016 >打印(字符串格式(“%.0f”,a)) 33333333333333332 请注意,如果该值符合32位有符号整数范围,也可以使用
%d
格式。但是,如果该值超过该范围,则无法很好地定义结果。以微秒为单位的系统时间戳可能超过32位范围

如果16位十进制数字的精度不够,有几种选择可以提高精度

首先,在
userdata
中打包一个真正的64位整数以及一组合适的算术元方法并不困难。这个问题偶尔会在网上讨论,但我不记得有人发布过完整的模块

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


第三,在谷歌中随意搜索很容易找到其他几个数学库包装;“%.0f”将根据需要使用相同数量的数字。/facepalm!伙计,我尝试了各种格式的字符串,但从未考虑过浮点选项。谢谢@NathanKitchen-
“%.f”
“%.0f”
相同,但与其他语言相比有点短: