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原理

  1. // 将数据转为base64的原理
  2. let rawBase64 =
  3. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  4. let str = "数";
  5. console.log(Buffer.from(str).toString("base64"));
  6. let buf = Buffer.from(str);
  7. console.log(buf); // <Buffer e6 95 b0>
  8. // 将e6 95 b0转为二进制
  9. console.log((0xe6).toString(2), (0x95).toString(2), (0xb0).toString(2)); // 11100110 10010101 10110000
  10. // 由于8位二进制最大可表示128位,超过64位。所以要将8位转为6位的二进制数,但是会多出一个值。 8X3 == 6X4,造成base64比源数据大3/1
  11. // 111001 101001 010110 110000
  12. let newBuf =
  13. rawBase64[0b111001] +
  14. rawBase64[0b101001] +
  15. rawBase64[0b010110] +
  16. rawBase64[0b110000];
  17. console.log(newBuf); //5pWw