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 词法分析器会将它们转换为双精度并在这种情况下失去精度。这是使用我的 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 回答
1

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

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

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

如果number是 IEEE-754 double,则它不起作用。你必须知道你的 Lua 是如何实现的,并牢记技术限制。

于 2013-08-08T20:09:16.687 回答
1

查看此库以获取任意精度算术。你也可能对这个帖子感兴趣。

于 2013-08-08T19:35:23.483 回答
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'

希望能帮助到你。

于 2013-10-23T00:59:03.050 回答