是否有可能在 JavaScript 中实现没有舍入问题的任意精度算术?

Is it possible to achieve arbitrary-precision arithmetic with no rounding issues in JavaScript?

我试过 big.js、bignumber.js 和 decimal.js;它们在某一点上都工作得相当好,但是当我需要用足够大的 "odd" 数字进行任意精度计算时(我当前的测试用例是 31435517643980 * (1 / 31435517643980) === 1),它们就不够用了。我对任何允许我处理这样的表达式的解决方案持开放态度,包括调用外部 API。我目前正在查看 Wolfram|Alpha 的 API,但 2000 calls/month 限制是我想避免的限制,因为我的应用程序将进行相当多的调用。

如果这个问题的 SE 站点是错误的,请告诉我and/or 移动它。

可能最常见的做法是简单地将两个数字乘以同一个乘数,使它们没有小数点,然后进行运算,然后再除以。这是一个粗略的实现:

function getDigits(n){
    return n.toString().substring(n.toString().indexOf('.')+1).length;
}
function xNums(n1,n2){
    var highRes=(n1*Math.pow(10,getDigits(n1))*(n2*Math.pow(10,getDigits(n2))));
    return highRes/Math.pow(10,getDigits(n1))/Math.pow(10,getDigits(n2));
}

然后,运行xNums(31435517643980,(1 / 31435517643980))===1。在 Chrome

为我工作