Lua字符串转换成数字——不要使用E表示法

我有一个字符串表示一个大数,不超过19位数字,像"3435939477110523131",我想将它从字符串转换为数字并再次转换回来。但是,当我使用tonumber()时,它会以E表示法进行转换,这非常愚蠢。

Lua 5.1.4 版权所有(C) 1994-2008 Lua.org,PUC-Rio
> a="3435939477110523131"
> print(tonumber(a))
3.4359394771105e+18

它会丢失一些数字。有没有一种方法可以将其转换为完整的数字而不使用E表示法?

点赞
用户7396148
用户7396148

"3435939477110523131" 在 Lua 5.1 中过大无法精确存储。

我们可以通过以下代码验证:

local a = "3435939477110523131"
local ourNumber = tonumber(a)
local computersNumber = 3435939477110522900 --这是最终转换后 `a` 的值。

print(ourNumber == computersNumber)

在 Lua 5.1 中,以上代码将输出 true。在 Lua 5.1 中,您可以精确存储的最大整数是 2^53 - 1,即 9007199254740991


print 函数会尝试将其参数转换为字符串,对于数字,这会导致科学计数法,无法捕获全部精度。

您可以通过在 print 函数中将值转换为字符串来防止此问题发生,例如使用 string.format

str = "3435939477110523131"
num = tonumber(str)

print(str, num, string.format("%.f",num))

在 Lua 5.3 中,使用 "%.f" 进行 string.format 将会得到一个错误的结果,应该使用 tostring"%.i"

str = "3435939477110523131"
num = tonumber(str)

print(str, num, tostring(num), string.format("%.i",num), string.format("%.f",num))
2021-03-18 19:03:41