0

我想乘以这个数字:

5374711027510012111075768211110475111691021051041057653548210911210211112250867 66690120741165250567278571217510410482757487

用这个号码:

4956889911565576581818287977011111065876967103548749122901151091038910610511189

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

2.66418508698446E+201

这是:

266418508698446000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000

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

是否可以使用 C# 从这个计算中得到精确的数字(每个数字)?

谢谢

4

3 回答 3

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

在大约16 位数字之后,我们会失去某些整数的精度。

于 2013-08-12T15:14:44.763 回答
0

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

于 2013-08-12T15:22:19.430 回答
0

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

var num1 = BigInteger.Parse("5374711027510012111075768211110475111" + "69102105104105765354821091121021111225086766690120741165250560012111075768211110475111"

var num2 = BigInteger.Parse("4956889911565576581818287977011111065876967103548749122901151091038910610511189");

Console.WriteLine(num1 + num2);

于 2013-08-12T15:28:57.427 回答