即使在 javascript 中使用 BigInt() 后,二进制到十进制的结果也是错误的

Getting wrong result for binary to decimal even after using BigInt() in javascript

我试图在将两个给定的二进制字符串转换为小数(数字)然后将生成的小数(数字)转换回字符串之后添加它们。

即使在使用 BigInt().

之后,我也得到了错误的二进制到十进制
let a = "10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101";
let b="110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011";

var twoSum = function(a, b) {
let a1=BigInt(parseInt(a, 2));
 let b1=BigInt(parseInt(b,2));
let aStr=a1.toString(10);
let bStr=b1.toString(10);

console.log(aStr)
console.log(bStr)
};

console.log(twoSum(a, b));

输出:

        24847893154024981755840167936
        526700554598729745018195542016

正确的结果是:24847893154024981730169397005 & 526700554598729746900966573811

我不明白为什么我得到二进制到十进制的错误结果。

let a = "10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101";
// Binary to decimal
const d = BigInt('0b' + a);
// Turn the binary
const b = BigInt(a);


parseIntreturns一个Number。由于 Number 的有限精度小于输入字符串的长度,因此此时您已经失去了精度。之后将 Number 转换为 BigInt 不会恢复丢失的精度。

解决方法是将字符串直接转换为BigInt。本来应该有一个 BigInt.parseInt 功能,但 TC39(标准化 JavaScript 的委员会)一直没有完成它。同时,对于非十进制输入,BigInt 构造函数确实理解以 0x...(十六进制)、0o...(八进制)和 0b...(二进制)开头的字符串。在这种情况下,后者是您想要的。所以你可以按如下方式修复你的代码:

function parseBinaryToBigInt(a) {
  return BigInt('0b' + a);
}

function twoSum(a, b) {
  let a1 = parseBinaryToBigInt(a);
  let b1 = parseBinaryToBigInt(b);
  let aStr = a1.toString(10);
  let bStr = b1.toString(10);

  console.log(aStr)
  console.log(bStr)
};