C#中的大型双数学乘法

Ril*_*era 0 .net c# string double double-precision

我想要乘以这个数字:

5374711027510012111075768211110475111691021051041057653548210911210211112250867 66690120741165250567278571217510410482757487

用这个数字:

4956889911565576581818287977011111065876967103548749122901151091038910610511189

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

2.66418508698446E + 201

这是:

266418508698446000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000

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

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

谢谢

jas*_*son 11

是.使用BigInteger.它是为此目的而设计的.您使用的数字将不适合基本积分,甚至无法在浮点类型1中精确表示.

BigInteger m = BigInteger.Parse("374711027510012111075768211110475111691021051041057653548210911210211112250867 66690120741165250567278571217510410482757487");
BigInteger n = BigInteger.Parse("4956889911565576581818287977011111065876967103548749122901151091038910610511189");
var product = m * n;
Console.WriteLine(proudct);
Run Code Online (Sandbox Code Playgroud)

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

2^24 = (2^10)^2.4 ~ (10^3)^2.4 ~ 10^7
Run Code Online (Sandbox Code Playgroud)

大约七位数后,我们会失去一些整数的精度.

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

2^53 = (2^10)^5.3 ~ (10^3)^5.3 ~ 10^16
Run Code Online (Sandbox Code Playgroud)

大约十六位数后,我们会丢失一些整数的精度.