【问题标题】:How can I print a huge number in Lua without using scientific notation?如何在不使用科学计数法的情况下在 Lua 中打印大量数字?
【发布时间】:2010-11-11 03:26:07
【问题描述】:

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

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

我意识到我可以编写一个函数来获取原始数字,除以 10 并循环打印数字,但这似乎很麻烦。肯定有某种语言内置的方法可以做到这一点?

【问题讨论】:

标签: lua scientific-notation


【解决方案1】:
> print(string.format("%18.0f",1247687475123456))

1247687475123456

【讨论】:

  • 可以省略宽度; "%.0f" 将根据需要使用尽可能多的数字。
  • /facepalm!伙计,我尝试了各种格式字符串,但从未考虑过浮点选项。谢谢!
  • @NathanKitchen - "%.f""%.0f" 相同,但更短一些
【解决方案2】:

通常配置的 Lua 使用您平台的常用双精度浮点格式来存储所有数字。对于当今大多数桌面平台,这将是 64 位 IEEE-754 格式。 conventional wisdom 是 -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 > 打印(string.format("%f",a)) 33333333333333332.000000 > 打印(字符串.格式(“%e”,a)) 3.333333e+016 > 打印(string.format("%.0f",a)) 33333333333333332

请注意,如果该值在 32 位有符号整数范围内,您也可以使用 %d 格式。但是,如果值超出该范围,则结果无法很好地定义。以微秒为单位的系统时间戳可能会超出 32 位范围。

如果 16 位十进制数字的精度不够,有多种选择可用于提高精度。

首先,将真正的 64 位整数与一组合适的算术元方法一起打包到 userdata 中并不难。 Lua mailing list 偶尔会讨论这个问题,但我不记得看到有人发布了完整的模块。

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

第三,在 Google 中随意搜索很容易找到其他几个数学库包装器。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2013-04-12
    • 2012-11-30
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2012-09-24
    相关资源
    最近更新 更多