我想将这个数字相乘:
5374711027510012111075768211110475111691021051041057653548210911210211112250867 66690120741165250567278571217510410482757487
有这个号码:
4956889911565576581818287977011111065876967103548749122901151091038910610511189
但是当我将结果转换为字符串时,我得到了这个:
2.66418508698446E + 201
这是:
266418508698446000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000
不完全精确的数字,那些零表示精度损失,我是对的吗?
是否可以使用C#从该计算中获取精确数字(每一位数字)?
由于
答案 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);