在JavaScript中将十六进制转换为浮点
我想把以10为基数的分数转换成以16为基数的数字在JavaScript中将十六进制转换为浮点,javascript,numbers,hex,Javascript,Numbers,Hex,我想把以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,这不
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]);
那么,有什么替代方案呢
免责声明:我认为这是一个微不足道的问题,但谷歌没有给我任何答案
让我问了上面的问题。试试这个:
除以16:23.5另一种可能是分别解析数字,将字符串一分为二,并在转换过程中将这两部分视为整数,然后将它们重新相加
函数parseFloat(str,基数)
{
var parts=str.split(“.”);
如果(零件长度>1)
{
返回parseInt(部分[0],基数)+parseInt(部分[1],基数)/Math.pow(基数,部分[1].length);
}
返回parseInt(部分[0],基数);
}
var-myno=28.4382;
var convno=myno.toString(16);
var f=parseFloat(convno,16);
console.log(myno+“->”+convno+“->”+f)代码>请尝试以下操作:
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];
}
函数hex2dec(hex){
十六进制=十六进制分割(/\./);
var len=hex[1]。长度;
十六进制[1]=parseInt(十六进制[1],16);
十六进制[1]*=数学功率(16,-len);
返回parseInt(十六进制[0],十六进制)+十六进制[1];
}
// ----------
//试验
// ----------
函数计算(十六进制){
设dec=hex2dec(hex);
msg.innerHTML=`dec:${dec}
十六进制测试:${dec.toString(16)}`
}
让init=“bad.a55”;
inp.value=init;
计算(初始)代码>
我组合并生成了一个重载的parseFloat函数,该函数以一个参数作为基数(更简单、更通用):
我不确定你想在那里解析什么十六进制格式。这像是“a1.2c”吗
浮点数通常使用十六进制格式存储。该标准不使用任何点(在纯十六进制字母表中不存在)。取而代之的是三组预定义长度的位(1+8+23=总共32位)─ double使用64位)
我编写了以下函数,用于将此类数字解析为浮点:
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);
}
试试这个
字符串可以是包含四个字符(0-255)的原始数据(简单文本)或
十六进制字符串“0xFFFFFF”长度为四个字节
var str='0x3F160008';
函数parseFloat(str){
var float=0,符号,顺序,尾数,exp,
int=0,multi=1;
如果(/^0x/.exec(str)){
int=parseInt(str,16);
}
否则{
对于(变量i=str.length-1;i>=0;i-=1){
如果(str.charCodeAt(i)>255){
log('错误的字符串参数');
返回false;
}
int+=str.charCodeAt(i)*multi;
多重*=256;
}
}
符号=(int>>>31)?-1:1;
exp=(int>>>23&0xff)-127;
尾数=((int&0x7fffff)+0x800000);
对于(i=0;i,以下是尺寸改进:
函数hex2dec(hex){
设h=十六进制分裂(/\./);
返回('0x'+h[1])*(16**-h[1]。长度)+('0x'+h[0]);
}
函数计算(十六进制){
设dec=hex2dec(hex);
msg.innerHTML=`dec:${dec}
十六进制测试:${dec.toString(16)}`
}
让init=“bad.a55”;
inp.value=init;
计算(初始);
在我看到这个问题后,我实际上只是想弄明白这一点。谢谢kent。我宁愿调用parseFloat以外的函数。但无论如何,这是一个重载:)如果“parts[0]”是空字符串,不要忘了将整数部分默认为0。例如,在解析“.0f”时。请参见下面Kevin的答案。为了转换以10为基数的数字,您不需要解析十六进制格式。您没有回答运算,而是回答“反向”问题。在javascript中也不起作用,因为二进制运算符在执行运算之前将其两个参数都转换为整数。因此,在上面,您正在对整数p进行运算“num”的艺术,而不是在IEEE754表示上。它不起作用的另一个原因是JS使用64位双精度而不是32位浮点。如果您真的想在IEEE754表示上操作,您可以使用ByteArray编写双精度/浮点并读回底层字节。没有使用哪个变量顺序
。为什么?
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);
}
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;
}
function hex2dec(hex) {
let h = hex.split(/\./);
return ('0x'+h[1])*(16**-h[1].length)+ +('0x'+h[0]);
}