如何打印在Lua一个庞大的数字,而无需使用科学记数法?(How can I print a huge

2019-06-26 01:37发布

我处理在Lua时间戳显示微秒从纪元(例如“1247687475123456”)的数量。

真的很希望能够打印在其所有可怕的荣耀的数字,但Lua中坚持以科学计数法打印。 我已经冲刷可用文档关于打印的格式化字符串,但唯一可用的命令是“打印在科学记数法(%E /%E)”和“科学记数法自动打印,如果数字是很长(%G)” 。 没有选择似乎可用来打印以正常形式的数量。

我意识到,我可以写,将采取原来的号码,由10做一些划分和环型打印数字,但似乎像一个不雅带来便捷的功能。 肯定有这样一种建立在对语言的某种方式?

Answer 1:

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

1247687475123456



Answer 2:

Lua的作为通常被配置使用您的平台的通常的双精度浮点格式来存储所有号码。 对于今天大多数桌面平台,这将是64位IEEE-754格式。 的传统智慧是,在范围-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个十进制数字是不够精确,有可用于提高精度几种选择。

首先,它不会是难以封装在一个真正的64位整数userdata与合适的一套算术元方法的沿。 这得到了上偶尔讨论的Lua的邮件列表 ,但我不记得看到任何人发布了一个完成的模块。

第二,Lua的作者之一发布了两个模块,支持高精度计算: LBC和lmapm 。 两者都在该页面找到。

在谷歌三,随便搜索很容易变成了其他几个数学库包装。



文章来源: How can I print a huge number in Lua without using scientific notation?