2012-02-20 58 views
1

我正在嘗試創建一個具有小數點精度的集合,舍入到小數點後兩位。然而,這個集合有很多數字,我必須使用BigInteger作爲解決方案。BigInteger的劃分和舍入

的細節: - 得到具有BigIntegers 集合 - 得到BigIntegers 的另一個集合 - 好大的整數 的第三集合 - 我要創建具有上述3個集的平均值的集合,值四捨五入到小數點後兩位。 即如果collection1有{2,3,4},collection2有{4,5,5},collection3有{5,3,2}我應該創建一個第4個集合{3.67,3.67,,3.67}

爲此,我正在使用此代碼:

 BigInteger divisor = new BigInteger(3.0d); 
    var averages = collection1.Zip(collection2, BigInteger.Add) 
        .Zip(collection3, 
        (xy, z) => BigInteger.Divide(BigInteger.Add(xy,z), divisor)); 

但是小數沒有出現。我不確定biginteger是否只能保存整數值而不是十進制值。

你能爲此建議一個解決方案嗎?

注意:它必須是基於LINQ的,因爲集合相當龐大,並且有一些很大的值(因此也是biginteger)。

+3

提示:**整數**。 [ExactlyWhatItSaysOnTheTin(http://tvtropes.org/pmwiki/pmwiki.php/Main/ExactlyWhatItSaysOnTheTin) – SLaks 2012-02-20 17:43:56

+1

即使BigInteger的停留整數 – alexsuslin 2012-02-20 17:46:37

回答

2

那麼你沒有得到任何十進制值,因爲BigInteger只代表整數

是否decimal大到足以容納您感興趣的數字?

如果沒有,你可能要考慮乘以everthing 100,並修改格式化的一面,使「1500」顯示爲「15.00」等。你仍然需要做一些工作,以最終「.67」而不是「.66」爲三分之二的結果,因爲這是截斷而不是四捨五入時的自然結果。

+0

小數不夠好,因爲它具有保持在斐波那契序列,其爲434665576869374564356885276750 406258025646605173717804024817 290895365554179490518904038798第1000號400792551692959225930803226347 752096896232398733224711616429 964409065331879382989696499285 16003704476137795166849228875. – Mike 2012-02-20 17:52:45

+0

@Mike:出於興趣,*爲什麼*你需要取三個斐波納契數的平均值?這聽起來像一個非常奇怪的要求。 – 2012-02-20 17:55:54

+0

是的,它只是用於學術目的。 – Mike 2012-02-20 18:05:31

0

除以三之後的殘基將爲.00,.33或.67。你應該能夠確定這三個值中的哪一個是合適的。我不確定你想如何讓你的集合存儲的東西,但是,考慮到支持分數的數字類型將無法保持你的結果,除非你想定義一個「大整數加小分數」類型或將您的號碼存儲爲字符串。