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
但我想知道是否已有任何标准。
答案 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)
您可以将数字(作为字符串)拆分为点,并使用自己的函数处理整数部分,使用另一个函数处理小数部分以获得正确的值。
该解决方案也适用于其他基地。
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;
答案 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());