我试图返回非常长的整数,但我的结果返回为 “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位数字,它会正确显示。
如何在不删除数字的情况下获得正确的结果?
答案 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'
希望它有所帮助。