2014-11-05 85 views
1

A和B是整數。舍入總誤差百分比

是否某些,在JavaScript中取整誤差的所有複雜,即:

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

這就是說,如果用戶A和B分別進入10和20,我可以用A = .33333333和B = .66666666存儲總和(30),然後將總和乘以這些小數以返回到10的值(沒有舍入誤差)?

+1

您應該使用某種舍入tollerant比較或google實現有理數的庫。例如,rational.js或fraction.js。順便說一句,不僅四捨五入,但數字表示本身yeilds比較問題。試試'0.1 + 0.2 === 0.3' – 2014-11-05 16:17:40

+0

我知道你提出的情況。當A和B都是整數時,情況仍然如此嗎? – 2014-11-05 16:21:47

+0

哦,在我的等式中,似乎也沒有一種情況,即您要添加或乘以兩位小數。雖然,顯然你會乘以一個小數和一個整數。 – 2014-11-05 16:42:05

回答

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值。