2012-02-20 55 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。你应该能够确定这三个值中的哪一个是合适的。我不确定你想如何让你的集合存储的东西,但是,考虑到支持分数的数字类型将无法保持你的结果,除非你想定义一个“大整数加小分数”类型或将您的号码存储为字符串。