当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在不使用科学记数法的情况下在Lua中打印大量数字?》经验,为你挑选了2个好方法。

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

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

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



1> Doug Currie..:
> print(string.format("%18.0f",1247687475123456))

1247687475123456


你可以省略宽度; "%.0f"将根据需要使用完全相同的位数.

2> RBerteig..:

通常配置的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.两者都在该页面上找到.

第三,随意搜索谷歌很容易找到其他几个数学库包装.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有