如何将二进制分数转换为十进制

时间:2016-05-09 07:28:18

标签: javascript binary

Javascript具有函数parseInt(),它可以帮助将二进制形式的整数转换为十进制等值:

parseInt("101", 2) // 5

但是,我需要将二进制小数转换为十进制小数,例如:

0.101 = 0.625

我可以编写自己的函数来计算结果,如下所示:

1 * Math.pow(2, -1) + 0*Math.pow(2, -2) + 1*Math.pow(2, -3) // 0.625

但我想知道是否已有任何标准。

6 个答案:

答案 0 :(得分:9)

这个问题询问是否存在一些用于解析二进制浮点数的JavaScript标准,好像parseFloat()可以采用第二个基数参数来解析二进制数0.101一样,{{1 }}。

虽然没有这样的标准,但是有一种简单直接的方法可以解决这个问题。

如果我们将二进制数parseFloat('0.101', 2)表示为二进制分数,则很容易将其转换为十进制分数:

  

0.101 2 = 101 2 / 1000 2 =(5/8) 10 = 0.625

以下单行表达式将其转换为JavaScript。在这里,0.101可以是任何类型的二进制数(表示为字符串),包括负数:

num

该解决方案很容易适应2到36之间任何基数的浮点数,我们可以将其包装在我们自己的parseInt(num.replace('.', ''), 2) / Math.pow(2, (num.split('.')[1] || '').length) 函数中:

parseFloatRadix()

答案 1 :(得分:2)

我的逻辑是parseInt(res[0] + res[1], base) / Math.pow(base, res[1].length);

例如:      var fValue = '-1100.0011'; var result= parseInt('-11000011', base) / Math.pow(base, '0011'.length);

<script>
    parseFractionInt = (value, base = 2) => {
        var res = value.split('.');
        return res.length < 2 ? 
                parseInt(value, base) : 
                parseInt(res[0] + res[1], base) / Math.pow(base, res[1].length);
    }

    console.log(parseFractionInt('0.101'));  //0.625
    console.log(parseFractionInt('1100'));           //    12
    console.log(parseFractionInt('0.0011'));         //     0.1875
    console.log(parseFractionInt('1100.0011'));      //    12.1875

    console.log(parseFractionInt('ABC', 16));      //  2748
    console.log(parseFractionInt('0.DEF', 16));    //     0.870849609375
    console.log(parseFractionInt('ABC.DEF', 16));  //  2748.870849609375

    console.log(parseFractionInt('-ABC.DEF', 16)); // -2748.870849609375
    console.log(parseFractionInt('-1100.0011'));    //   -12.1875
    console.log(parseFractionInt('G.G', 16));   //NaN
    console.log(parseFractionInt('A.G', 16));   //0.625

</script>

答案 2 :(得分:1)

  

但我想知道是否已有任何标准。

根据我的知识

我认为你需要创建自己的功能:

  function toDecimal(string, radix) {
    radix = radix || 2;
    var s = string.split('.');
    var decimal = parseInt(s[0], radix);

    if(s.length > 1){
       var fract = s[1].split('');

       for(var i = 0, div = radix; i < fract.length; i++, div = div * radix) {
          decimal = decimal + fract[i] / div;
       }
    }
    return decimal;
  }

答案 3 :(得分:1)

您可以将数字(作为字符串)拆分为点,并使用自己的函数处理整数部分,使用另一个函数处理小数部分以获得正确的值。

该解决方案也适用于其他基地。

&#13;
&#13;
function convert(v, base) {
    var parts = v.toString().split('.');
    base = base || 2;
    return parseInt(parts[0], base) + (parts[1] || '').split('').reduceRight(function (r, a) {
        return (r + parseInt(a, base)) / base;
    }, 0);
}

document.write(convert(1100) + '<br>');
document.write(convert(0.0011) + '<br>');
document.write(convert(1100.0011) + '<br>');

document.write(convert('ABC', 16) + '<br>');
document.write(convert('0.DEF', 16) + '<br>');
document.write(convert('ABC.DEF', 16) + '<br>');
&#13;
&#13;
&#13;

答案 4 :(得分:1)

TL; DR

var convert = (S, B) => (parseInt((S = S.toString().trim().split("."))[0].replace("-", ""), (B = +B || 2)) + (S[1] || "").split("").reduceRight((s, b) => (s + parseInt(b, B)) / B, 0)) * (+(S[0][0] !== "-") || -1);

Nina Scholz有一个nice example,但它不适用于负数(加上其他问题)。
所以,这是一个改进的:

function convert(string, base) {
    string = string.toString().trim().split(".");
    base = +base || 2;
    return (parseInt(string[0].replace("-", ""), base) + (string[1] || "").split("").reduceRight((sum, bit) => (sum + parseInt(bit, base)) / base, 0)) * (+(string[0][0] !== "-") || -1);
}

convert(1100.0011); // -12.1875
convert(-1100.0011); // -12.1875
convert("-Z.ZZZ", 36); // -35.99997856652949

据我所知,JavaScript并没有提供这样的内置功能。<​​/ p>

答案 5 :(得分:0)

您可以创建像parseInt这样的javascript扩展方法,因为我创建的方法parseBinary只能链接parseInt

String.prototype.parseBinary = function parseBinary() {
  var radix = 2;
  var s = this.split('.');
  var decimal = parseInt(s[0], radix);

  if(s.length > 1){
    var fract = s[1].split('');

    for(var i = 0, div = radix; i < fract.length; i++, div = div * radix)
    {
      decimal = decimal + fract[i] / div;
    }
  }
  return decimal;
};

要使用此方法,您可以使用以下代码调用它。

var str = "0.101";
alert(str.parseBinary());

以下是javascript代码

的工作示例

String.prototype.parseBinary = function parseBinary() {
  var radix = 2;
  var s = this.split('.');
  var decimal = parseInt(s[0], radix);

  if(s.length > 1){
    var fract = s[1].split('');

    for(var i = 0, div = radix; i < fract.length; i++, div = div * radix)
    {
      decimal = decimal + fract[i] / div;
    }
  }
  return decimal;
};

var str = "0.101";
alert(str.parseBinary());