toString使用中遇到的问题
js中的toString方法可以将不同类型的数据转换成字符串,当使用变量的形式调用toString方法的时候没有问题,但当直接将值作用与toString方法时候,像这样11.toString()会报错。
示例
console.log(11.toString());
这是因为整数后面的.会被识别为是小数值后面的. 等价于下面这种写法
console.log(11.0toString())
解决方式就是改变这个识别的问题
console.log(11 .toString())
浮点数的toString()
js当中的Number使用的是IEEE 754格式表示整数和浮点值。并且IEE 754的64位二进制中的后52位小数也会按照科学计数法来表示。对于二进制来说就是2的多少次方,小数点后面第一位就是2的-1次方。
0.112.toString(2)
简单理解就是
- 0.112 * 2 = 0.224 不满足1 赋予0
- 0.224 * 2 = 0.448 不满足1 赋予0
- 0.448 * 2 = 0.896 不满足1赋予0
- 0.896 * 2 = 1.792 满足1,所以二进制当中的小数点后面的第4位是1
- 0.792 * 2 = 1.584 满足1,所以还是1
- 0.584 * 2 = 1.168 满足1
- 0.168 * 2 = 0.336 是0
对应的像其余进制,你可以理解为×这个对应进制来判断当前是不是0,然后对应的整数为就用对应的进制数进行表示。
0.1+0.2 不等于 0.3的原因
然后按照二进制进行运算(不考虑*进制操作中出现的无限循环以及位数限制)
0.1 - 0.0001100110011001100110011001100110011001100110011001101
+
0.2 - 0.001100110011001100110011001100110011001100110011001101
=
- 0.0100110011001100110011001100110011001100110011001100111
const test = (str) => {
let strArr = str.split('.');
let intNum = strArr[0].split('').reverse();
let floatNum = strArr[1] ? strArr[1]: [];
let intToatl = 0;
let floatTotal = 0;
for(let i = 0; i < intNum.length; i++){
intToatl += intNum[i] * (2 ** i);
/*
因为二进制1111的表示分别是
1*2**3,
1*2**2,
1*2**1,
1*2**0
*/
};
for(let i = 0; i < floatNum.length; i++){
floatTotal += floatNum[i] * (2 ** -(i + 1));
/*
对于小数位的二进制,第一个就是*2后获取的值
*/
}
return intToatl + floatTotal;
}
console.log(test('0.0100110011001100110011001100110011001100110011001100111'));