liaFcipE
@liaFcipE

Почему получается число отличное от калькулятора?

Как конвертировать HEX в DEC, почему получается число отличное от калькулятора?
Пример из калькулятора Windows:
64d31a8abad99511073847.png

В сети:
function hexToSignedInt(hex) {
    if (hex.length % 2 != 0) {
        hex = "0" + hex;
    }
    var num = parseInt(hex, 16);
    var maxVal = Math.pow(2, hex.length / 2 * 8);
    if (num > maxVal / 2 - 1) {
        num = num - maxVal
    }
    return num;
}

hexToSignedInt("FFFFFFFFFFFFCCFF") // -12288
  • Вопрос задан
  • 114 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Number.MAX_SAFE_INTEGER           // 9007199254740991 = 2**53 - 1
parseInt('FFFFFFFFFFFFCCFF', 16)  // 18446744073709540000
BigInt('0xFFFFFFFFFFFFCCFF')      // 18446744073709538559n
Таким образом, пытаясь преобразовать такое значение из шестнадцатеричного в десятичное обычного типа Number, вы теряете последние разряды, поскольку число получается не целым, а вещественным.
Ответ написан
liaFcipE
@liaFcipE Автор вопроса
Спасибо всем, в 4 часа ночи, мне не удалось понять, что при конвертации шестнадцатеричного числа в десятичное я выйду за Number.MAX_SAFE_INTEGER.

Решил с помощью BigInt, как и намекнул Rsa97

function hexToSignedInt(hex) {
    hex.length % 2 !== 0 && (hex = "0" + hex);
    
    const hexAsNumber = BigInt("0x" + hex);
    const maximalValue = BigInt(Math.pow(2, hex.length / 2 * 8));

    if (hexAsNumber > maximalValue / 2n - 1n) {
       return Number(hexAsNumber - maximalValue)
    }

    return Number(hexAsNumber);
}

const result = hexToSignedInt("FFFFFFFFFFFFCCFF") // -13057n
console.log(result);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы