Преобразование шестнадцатеричного в 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 не дал мне никаких ответов.
Ответы
Ответ 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);
}