即使在 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);
parseInt
returns一个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)
};
我试图在将两个给定的二进制字符串转换为小数(数字)然后将生成的小数(数字)转换回字符串之后添加它们。
即使在使用 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);
parseInt
returns一个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)
};