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