如何在Lua中返回非常长的整数

时间:2013-08-08 19:15:57

标签: parsing lua return steam

我试图返回非常长的整数,但我的结果返回为 “7.6561197971049e + 016”。 如何让它返回76561197971049296?

local id64 = 76561197960265728
Z = string.match("STEAM_0:0:5391784", 'STEAM_%d+:%d+:(%d+)')
Y = string.match("STEAM_0:0:5391784", 'STEAM_%d+:(%d+):%d+')
--For 64-bit systems
--Let X, Y and Z constants be defined by the SteamID: STEAM_X:Y:Z.
--Let V be SteamID64 identifier of the account type (0x0110000100000000 in hexadecimal format).
--Using the formula W=Z*2+V+Y
if Z == nil then
    return "none"
else
    return Z*2+id64+Y
end

我现在使用此代码安装lbc任意精度

return  bc.add(bc.number(id64),bc.number(2)):tostring()

它返回70000000000000002,但是如果我从id64删除3位数字,它会正确显示。

如何在不删除数字的情况下获得正确的结果?

4 个答案:

答案 0 :(得分:3)

您需要使用字符串作为长数字。否则,Lua lexer将它们转换为双精度并且在这种情况下会失去精度。这是使用我的lbc的代码:

local bc=require"bc"
local id64=bc.number"76561197960265728"
local Y,Z=string.match("STEAM_0:0:5391784",'STEAM_%d+:(%d+):(%d+)')
if Z == nil then
    return "none"
else
    return (Z*2+id64+Y):tostring()
end

答案 1 :(得分:1)

查看this library任意精确算术。 this so post也可能对您感兴趣。

答案 2 :(得分:1)

假设您的Lua实现支持number类型中的许多有效数字,您的return语句将返回该结果。

当您将数字转换为字符串或打印时,您可能会看到指数表示法。您可以使用string.format功能来控制转换:

assert( "76561197971049296" == string.format("%0.17g", 76561197971049296))

如果number是IEEE-754双倍,那么它就不起作用。您必须知道您的Lua是如何实现的,并牢记技术限制。< / p>

答案 3 :(得分:1)

如果您安装了luajit,则可以执行以下操作:

local ffi = require("ffi")

steamid64 = tostring(ffi.new("uint64_t", 76561197960265728) + ffi.new("uint64_t", tonumber(accountid)))
steamid64 = string.sub(steamid64, 1, -4) -- to remove 'ULL at the end'

希望它有所帮助。