C#中的大型双数学乘法

时间:2013-08-12 15:13:13

标签: c# .net string double double-precision

我想将这个数字相乘:

  

5374711027510012111075768211110475111691021051041057653548210911210211112250867   66690120741165250567278571217510410482757487

有这个号码:

  

4956889911565576581818287977011111065876967103548749122901151091038910610511189

但是当我将结果转换为字符串时,我得到了这个:

  

2.66418508698446E + 201

这是:

  

266418508698446000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000   000000000000000000000000000000000000000000000000000000000000   0000000000000000000000000000000

不完全精确的数字,那些零表示精度损失,我是对的吗?

是否可以使用C#从该计算中获取精确数字(每一位数字)?

由于

3 个答案:

答案 0 :(得分:11)

是。使用BigInteger。为此目的,设计。您使用的数字将不适合原始积分,甚至不能在浮点类型 1 中表示精确

BigInteger m = BigInteger.Parse("374711027510012111075768211110475111691021051041057653548210911210211112250867 66690120741165250567278571217510410482757487");
BigInteger n = BigInteger.Parse("4956889911565576581818287977011111065876967103548749122901151091038910610511189");
var product = m * n;
Console.WriteLine(proudct);

1 :单精度浮点可以表示-2 ^ 24和2 ^ 24 正好之间的所有整数,因为它有一个23位显式加一个隐式位尾数;之后它失去了精确度。正如

2^24 = (2^10)^2.4 ~ (10^3)^2.4 ~ 10^7

七位数后,某些整数会失去精确度。

类似地,双精度浮点可以表示-2 ^ 53和2 ^ 53 之间的所有整数正好,因为它具有52位显式加上一个隐式位尾数;之后它失去了精确度。正如

2^53 = (2^10)^5.3 ~ (10^3)^5.3 ~ 10^16

十六位数后,我们会失去某些整数的精度。

答案 1 :(得分:0)

A double的最大精度(有效位数)限制为15.您的数字位数太多,因此无法在不损失精度的情况下存储为双精度数。

答案 2 :(得分:0)

如果您使用的是.NET 4.5,请使用system.Numerics程序集。 http://msdn.microsoft.com/en-us/library/system.numerics.aspx

  

var num1 = BigInteger.Parse(“5374711027510012111075768211110475111”+                                              “69102105104105765354821091121021111225086766690120741165250567278571217510410482757487”);

     

var num2 =                   BigInteger.Parse( “4956889911565576581818287977011111065876967103548749122901151091038910610511189”);

     

Console.WriteLine(num1 + num2);