总回报百分比的舍入误差

时间:2014-11-05 16:12:45

标签: javascript math

A和B是整数。

是否某些,以及JavaScript中舍入错误的所有复杂性:

(A/(A+B))*(A+B) === A

这就是说,如果用户分别为A和B输入10和20,我可以用A = .33333333和B = .66666666存储总和(30),然后将这些小数乘以这些小数回到10的值(没有舍入错误)?

1 个答案:

答案 0 :(得分:0)

我开始用一些简单的脚本来回答我自己的问题。

这是我跑的地方:

var maxDifference = 0;

var assert = function (a, b) {
  var derivedA = (a/(a+b))*(a+b);
  if (!(derivedA === a) && (a - derivedA) > maxDifference) {
    console.log('----\nFound new biggest difference');
    console.log('a:', a);
    console.log('b:', b);
    console.log('difference:', (a - derivedA));
    maxDifference = a - derivedA;
  }
}

for (var a = 1; a < 10000000; a++) {
  for (var b = 1; b < 10000000; b++) {
    assert(a, b);
  }
}

console.log('Max Difference:', maxDifference);

我发现可能存在差异。这种差异类似于(2^n)*Number.EPSILON,其中n是(到目前为止)15。这是关于:3.9968028886505635e-15

舍入似乎是一种可靠地返回原始int的安全方式。