如何在javascript中准确舍入浮点数?

时间:2018-03-06 04:08:57

标签: javascript math floating-point decimal rounding

  

我已经在很多地方寻找过这方面的答案,包括但不是   限于https://stackoverflow.com,我不在这里   试图复制一个问题。我来这里是为了明确   回答如何最好地缓解这个问题。我将不胜感激   我可以得到任何帮助,因为我相信很多人也会这样做。谢谢   你非常喜欢。

0.9999 * 0.9999!= 0.9998000100000001

我正在撰写Google Chrome扩展计算器。最好是给出正确答案的答案,但我会不断得到奇怪的答案。真的需要弄清楚这个。

我已经建立了 Math.js ,因为它具有强大的数学功能。对于舍入,我使用了 math.round(),我将在下面发布两个函数,并且在此处发布问题之前作为最后的努力, Big.js 稍后对大数字进行舍入和额外帮助。

我到目前为止在互联网上找到的每一个舍入函数,我能够实现的最接近的答案是 0.99980001 ,这不是正确的答案。正确的答案是 0.9998

我查看了 toPrecision() toFixed()但我必须知道哪个随机结果所需的小数位数到任意随机数除非用户指定特定数量的小数位,否则这个方程实际上是不可能的,但即便如此,他们仍然需要正确的答案。

我考虑过编写一个人工智能的启发式算法来识别任何十进制字符串中有效的有效位数,但是这个解决方案既费时又有点过分,因为必须有一个已经实现的解决方案或者不知何故。

用于进行数学处理和处理答案的代码:

//math_eval[0] = gaussRound(Round(math.eval(math_str), 15), 15);
//math_eval[0] = math.format(math.eval(math_str), {precision: 14});
//math_eval[0] = Big(math.eval(math_str));
//math_eval[0] = math_eval[0].round(math_eval[0]);
//bg = new Big(math.eval(math_str));
//math_eval[0] = Round(bg.round(14), 14);
math_eval[0] = math.eval(math_str);

您看到的两个舍入函数除了内置之外被调用或 Big.js

// http://thenewcode.com/895/JavaScript-Rounding-Recipes
//
// Discovered significant digit errors and this function
// seems to alleviate them.
function gaussRound(num, decimalPlaces) 
{
    var d = decimalPlaces || 0,
    m = Math.pow(10, d),
    n = +(d ? num * m : num).toFixed(15),
    i = Math.floor(n), f = n - i,
    e = 1e-8,
    r = (f > 0.5 - e && f < 0.5 + e) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
}

// a second rounding function since even the one above still fails
function Round(Number, DecimalPlaces) 
{
    return Math.round(parseFloat(Number) * Math.pow(10, DecimalPlaces)) / Math.pow(10, DecimalPlaces);
}

1 个答案:

答案 0 :(得分:0)

经过进一步调查后,我发现确实用于检查数学的TI-89确实存在缺陷。到目前为止,这是我对世界级计算器的最后期望。

我相当肯定很多人都知道不相信他们从TI计算器那里得到的答案,这可能会损害声誉本身就是有价值的。

此事已得到解决。