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