0.1+0.2 !==0.3
0.1转为二进制:0.0001100110011001100110011001100110011001100110011001101
0.2转为二进制:0.001100110011001100110011001100110011001100110011001101
两个值都是无限循环的二进制数据,最终会用进位表示,两个都会比源值大。进行相加之后会大于0.3
小数转二进制的算法
小数X2取整:
以0.1为例 ,结果整数位没有值就取0,有值就取值。计算后的结果继续乘2取整
0.1 2 = 0.2 => 0
0.2 2 = 0.4 => 0
0.4 2 = 0.8 => 0
0.8 2 = 1.6 => 1
0.6 2 = 1.2 => 1
0.2 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
….. 无限循环,计算结果为0.0001100110011……
数据转base64原理
// 将数据转为base64的原理let rawBase64 ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let str = "数";console.log(Buffer.from(str).toString("base64"));let buf = Buffer.from(str);console.log(buf); // <Buffer e6 95 b0>// 将e6 95 b0转为二进制console.log((0xe6).toString(2), (0x95).toString(2), (0xb0).toString(2)); // 11100110 10010101 10110000// 由于8位二进制最大可表示128位,超过64位。所以要将8位转为6位的二进制数,但是会多出一个值。 8X3 == 6X4,造成base64比源数据大3/1// 111001 101001 010110 110000let newBuf =rawBase64[0b111001] +rawBase64[0b101001] +rawBase64[0b010110] +rawBase64[0b110000];console.log(newBuf); //5pWw
