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)
在大约十六位数后,我们会丢失一些整数的精度.