Подтвердить что ты не робот

Преобразование шестнадцатеричного в float в javascript

Этот вопрос заставил меня задать вопрос ниже.

Я хотел бы преобразовать число в базе 10 с долей в число в базе 16.

var myno = 28.5;

var convno = myno.toString( 16 );
alert( convno );

все хорошо. теперь я хочу преобразовать его обратно в десятичную. Но теперь я не могу писать

var orgno = parseInt( convno, 16 );
alert( orgno );

Так как он не возвращает десятичную часть.

И не может использовать parseFloat, поскольку для каждого MDC синтаксис parseFloat

parseFloat(str);

Это не было бы проблемой, если бы мне пришлось преобразовать обратно в int, поскольку синтаксис parseInt

parseInt(str [, radix]);

Итак, какова альтернатива для этого?

Отказ от ответственности: я думал, что это был тривиальный вопрос, но googling не дал мне никаких ответов.

4b9b3361

Ответ 1

Другая возможность состоит в том, чтобы разобрать цифры отдельно, разбивая строку на две части и обрабатывая обе части как int во время преобразования, а затем добавляя их обратно.

function parseFloat(str, radix)
{
        var parts = str.split(".");
        if ( parts.length > 1 )
        {
                return parseInt(parts[0], radix) + parseInt(parts[1], radix) / Math.pow(radix, parts[1].length);
        }
        return parseInt(parts[0], radix);
}

var myno = 28.4382;
var convno = myno.toString(16);
var f = parseFloat(convno, 16);
alert(myno + " -> " + convno + " -> " + f );

Ответ 2

Я объединил ответы Mark и Kent, чтобы сделать перегруженную функцию parseFloat, которая принимает аргумент для radix (гораздо более простой и универсальный):

function parseFloat(string, radix)
{
    //split the string at the decimal point
    string = string.split(/\./);

    //if there is nothing before the decimal point, make it 0
    if (string[0] == '') {
        string[0] = "0";
    }

    //if there was a decimal point & something after it
    if (string.length > 1 && string[1] != '') {
        var fractionLength = string[1].length;
        string[1] = parseInt(string[1], radix);
        string[1] *= Math.pow(radix, -fractionLength);
        return parseInt(string[0], radix) + string[1];
    }

    //if there wasn't a decimal point or there was but nothing was after it
    return parseInt(string[0], radix);
}

Надеюсь, это поможет кому-то!

Ответ 3

Попробуйте это.

Строка

может представлять собой необработанные данные (простой текст) с 4 символами (0 - 255) или hex string "0xffffffff" 4 байта длина

jsfiddle.net

var str = '0x3F160008';

function parseFloat(str) {
    var float = 0, sign, order, mantiss,exp,
    int = 0, multi = 1;
    if (/^0x/.exec(str)) {
        int = parseInt(str,16);
    }else{
        for (var i = str.length -1; i >=0; i -= 1) {
            if (str.charCodeAt(i)>255) {
                console.log('Wrong string parametr'); 
                return false;
            }
            int += str.charCodeAt(i) * multi;
            multi *= 256;
        }
    }
    sign = (int>>>31)?-1:1;
    exp = (int >>> 23 & 0xff) - 127;
    mantissa = ((int & 0x7fffff) + 0x800000).toString(2);
    for (i=0; i<mantissa.length; i+=1){
        float += parseInt(mantissa[i])? Math.pow(2,exp):0;
        exp--;
    }
    return float*sign;
}

Ответ 4

Попробуйте следующее:

  • Определите, сколько цифр точности вам нужно после десятичной точки.
  • Умножьте свой исходный номер на мощность 16 (например, 256, если вы хотите две цифры).
  • Преобразуйте его как целое число.
  • Поместите десятичную точку вручную в соответствии с тем, что вы решили на шаге 1.

Отмените шаги для возврата назад.

  • Выньте десятичную точку, вспомнив, где она была.
  • Преобразование шестнадцатеричного в десятичное целое.
  • Разделите результат на соответствующую мощность 16 (16 ^ n, где n - количество цифр после десятичной точки, выбрали на шаге 1).

Простой пример:

Преобразуйте десятичное значение 23.5 в шестнадцатеричное число и после десятичной деления выберите одну цифру после десятичной точки.

23,5 x 16 = 376.

Преобразован в шестнадцатеричный = 0x178.

Ответ в базе 16: 17.8

Теперь преобразуем обратно в десятичное:

Выведите десятичную точку: 0x178

Преобразование в десятичную: 376

Разделить на 16: 23.5

Ответ 5

Пожалуйста, попробуйте следующее:

function hex2dec(hex) {
    hex = hex.split(/\./);
    var len = hex[1].length;
    hex[1] = parseInt(hex[1], 16);
    hex[1] *= Math.pow(16, -len);
    return parseInt(hex[0], 16) + hex[1];
}

Ответ 6

Я не уверен, какой шестнадцатеричный формат, который вы хотели проанализировать там, было что-то вроде: "a1.2c"?

Поплавки обычно хранятся в шестнадцатеричном формате, используя стандарт IEEE 754. Этот стандарт не использует никаких точек (которые не существуют в чистом шестнадцатеричном алфавите). Вместо этого существует 3 группы бит с предопределенной длиной (1 + 8 + 23 = 32 бит в общей сложности ─ двойное использование 64 бит).

Я написал следующую функцию для разбора таких чисел в float:

function hex2float(num) {
    var sign = (num & 0x80000000) ? -1 : 1;
    var exponent = ((num >> 23) & 0xff) - 127;
    var mantissa = 1 + ((num & 0x7fffff) / 0x7fffff);
    return sign * mantissa * Math.pow(2, exponent);
}