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 110000
let newBuf =
rawBase64[0b111001] +
rawBase64[0b101001] +
rawBase64[0b010110] +
rawBase64[0b110000];
console.log(newBuf); //5pWw