A和B是整数。
可以肯定的是,由于JavaScript中舍入错误的所有复杂性,使得:(A/(A+B))*(A+B) === A
这就是说,如果用户分别为A和B输入10和20,我是否可以将A = .33333333和B = .66666666的总和(30)存储起来,然后再将这些和与这些小数相乘以返回值10(无舍入误差)?
最佳答案
好吧,我开始用一些简单的脚本来回答我自己的问题。
这是我跑的东西:
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的安全方法。