在javascript中将十六进制转换为float

nav*_*een 20 javascript hex numbers

这个问题让我问下面的问题.

我想将基数为10的数字转换为基数为16的数字.

var myno = 28.5;

var convno = myno.toString( 16 );
alert( convno );
Run Code Online (Sandbox Code Playgroud)

一切都很好.现在我想将它转换回十进制.
但现在我不能写

var orgno = parseInt( convno, 16 );
alert( orgno );
Run Code Online (Sandbox Code Playgroud)

因为它不返回小数部分.

并且不能使用parseFloat,因为根据MDC,parseFloat的语法是

parseFloat(str);
Run Code Online (Sandbox Code Playgroud)

如果我必须转换回int,那将不会是一个问题,因为parseInt语法是

parseInt(str [, radix]);
Run Code Online (Sandbox Code Playgroud)

那么有什么替代方案呢?

免责声明:我认为这是一个微不足道的问题,但谷歌搜索没有给我任何答案.

Ken*_*ent 13

另一种可能性是分别解析数字,将字符串分成两部分,并在转换过程中将两个部分视为整数,然后将它们重新组合在一起.

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 );

Run Code Online (Sandbox Code Playgroud)


Mar*_*ich 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];
}
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)
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];
}



// ----------
// TEST
// ----------

function calc(hex) {
  let dec = hex2dec(hex);
  msg.innerHTML = `dec: <b>${dec}</b><br>hex test: <b>${dec.toString(16)}</b>`
} 

let init="bad.a55";
inp.value=init;
calc(init);
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试这个。

该字符串可以是具有四个字符 (0 - 255) 的原始数据(简单文本)或长度为四个字节的十六进制字符串“0xFFFFFFFF”。

jsfiddle.net

var str = '0x3F160008';

function parseFloat(str) {
    var float = 0, sign, order, mantissa, 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 parameter');
                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;
}
Run Code Online (Sandbox Code Playgroud)