1
A和B是整数。舍入总误差百分比
是否某些,在JavaScript中取整误差的所有复杂,即:
(A/(A+B))*(A+B) === A
这就是说,如果用户A和B分别进入10和20,我可以用A = .33333333和B = .66666666存储总和(30),然后将总和乘以这些小数以返回到10的值(没有舍入误差)?
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值。
您应该使用某种舍入tollerant比较或google实现有理数的库。例如,rational.js或fraction.js。顺便说一句,不仅四舍五入,但数字表示本身yeilds比较问题。试试'0.1 + 0.2 === 0.3' – 2014-11-05 16:17:40
我知道你提出的情况。当A和B都是整数时,情况仍然如此吗? – 2014-11-05 16:21:47
哦,在我的等式中,似乎也没有一种情况,即您要添加或乘以两位小数。虽然,显然你会乘以一个小数和一个整数。 – 2014-11-05 16:42:05