【发布时间】:2018-08-13 20:42:02
【问题描述】:
我已经在很多地方寻找答案,包括但不 仅限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);
}
【问题讨论】:
-
0.9998 的正确答案是什么?这不是将 0.9999 乘以 0.9999 的答案,即 0.99980001。您可以通过将 9999 乘以 9999 并在心理上调整小数点来重现
-
老实说,我使用的是 TI 仿真器来检查数学。有了你的评论,这让我想做更多的研究。我以前错了一次。谢谢你的澄清。
-
不客气,我试图取消反对票,但被拒绝了。如果问题基于错误的前提,请考虑删除。
-
我投票结束这个问题,因为它使用了一个错误的前提。
标签: javascript math floating-point decimal rounding