我如何在Lua中打印一个巨大的数,而不使用科学计数法?

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

我真的很想能够以其所有可怕的荣耀打印该数字,但 Lua 坚持用科学计数法打印它。我已经彻底搜索了有关打印格式化字符串的可用文档,但唯一可用的命令是“科学计数法打印(%e /%E)”和“如果数字非常长,则自动以科学计数法打印(%g)”。没有选项似乎可以将数字打印成正常形式。

我知道我可以编写一个函数,将原始数字取做一些除法并循环打印数字,但那似乎是一种不优雅的麻烦方法。肯定有一种内置于语言中的方法可以做到这一点吧?

原文链接 https://stackoverflow.com/questions/1133639

点赞
stackoverflow用户33252
stackoverflow用户33252
> print(string.format("%18.0f",1247687475123456))

输出结果为:1247687475123456

2009-07-15 20:19:25
stackoverflow用户68204
stackoverflow用户68204

Lua通常配置使用平台的常规双精度浮点格式来存储所有数字。对于今天的大多数桌面平台,这将是64位IEEE-754格式。常规智慧认为,范围在-1E15到+1E15之间的整数可以安全地假定被准确表示。

无论如何,string.format()函数通过(做一些微小的调整)传递其参数给平台对printf()的实现。 printf() 理解的格式字符串包括 %e%E 来强制使用"科学"符号,以及 %f 来强制使用简单的十进制符号。此外,%g%G 选择最短的符号。

例如:

E:\...>lua
Lua 5.1.4  版权所有(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。两者都可以在该页面找到。

第三,谷歌的随意搜索可以轻松地找到几个其他数学库的包装。

2009-07-15 21:04:33