如何在不使用科学记数法的情况下在Lua中打印大量数字?

时间:2009-07-15 20:02:08

标签: lua scientific-notation

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

真的喜欢能够将这个号码印在所有可怕的荣耀中,但Lua坚持用科学记谱法打印它。我已经搜索了有关打印格式化字符串的可用文档,但唯一可用的命令是“以科学记数法打印(%e /%E)”和“如果数字很长(%g),则以科学记数法自动打印” 。似乎没有选项以正常形式打印数字。

我意识到我可以写一个能取原始数字的函数,做一些除以10并在循环中打印数字,但这似乎是一个不优雅的麻烦。当然有一些方法可以做到这种内置于语言中的方法吗?

2 个答案:

答案 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。两者都在该页面上找到。

第三,在谷歌进行随意搜索很快就会出现其他几个数学库包装器。