Я пытаюсь преобразовать 32-битный Steam ID в 64-битный Steam ID.

Моя функция javascript работает неправильно, но та же функция в python работает нормально. Функция Python скопирована из Как получить steamid 64 из steamID в python

function steamidTo64(steamid) {
    let steam64id = 76561197960265728; // Valve's magic constant
    let id_split = steamid.split(":");
    steam64id += parseInt(id_split[2]) * 2;
    if (id_split[1] == "1") {
        steam64id += 1;
    }
    return steam64id;
}

Использование ввода функции STEAM_1:1:191000236 должно возвращать 76561198342266201, но вместо этого она возвращает 76561198342266200

Использование ввода функции STEAM_1:1:3645504 должно возвращать 76561197967556737, но она возвращает 76561197967556740

Использование ввода функции STEAM_0:0:570629725 должно возвращать 76561199101525178, но она возвращает 76561199101525180

0
Hamburjare 18 Ноя 2022 в 23:51
1
Числовые литералы с абсолютными значениями, равными 2^53 или больше, слишком велики для точного представления в виде целых чисел.
 – 
caTS
18 Ноя 2022 в 23:53

1 ответ

Лучший ответ

Вам нужно будет использовать BigInt, поскольку 76561197960265728 больше, чем 9007199254740992 (на 1 цифру больше), поэтому арифметические операции над этим числом неточны и могут привести к неверным результатам.

function steamidTo64(steamid) {
    let steam64id = 76561197960265728n;
    
    const id_split = steamid.split(":");

    steam64id += BigInt(id_split[2]) * 2n;

    if (id_split[1] === "1") steam64id += 1n;

    return steam64id;
}

// Result is BigInt
console.log(steamidTo64("STEAM_1:1:191000236").toString());
0
caTS 19 Ноя 2022 в 00:00