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

时间:2015-01-31 05:55:48

标签: javascript math rounding-error

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

如果这个问题是错误的SE网站,请告诉我和/或移动它。

1 个答案:

答案 0 :(得分:1)

最常见的方法可能就是将两个数字乘以相同的乘数,使它们没有小数,然后再进行操作,再划分。这是一个粗略的实现:

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