1

非常に長い整数を返そうとしていますが、結果は "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

4 に答える 4

3

長い数値には文字列を使用する必要があります。それ以外の場合、Lua lexer はそれらを double に変換し、この場合は精度を失います。私の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
于 2013-08-08T21:23:22.473 に答える