2016-05-12 34 views
3

这对我来说很陌生,但您可以尝试自己这个短代码:BigInteger.Parse工作正确

var num1 = BigInteger.Parse("1e+9999", NumberStyles.AllowExponent); 
var num2 = BigInteger.Parse("1e+9998", NumberStyles.AllowExponent); 
var div = num1/num2; // is 1, but must be 10 
var eq = num1 == num2; // true, but must be false 

建议?

+1

什么是dotnet BigInteger记录的范围? – LutzL

+0

无限!也许,RAM的大小。 – TimeCoder

回答

4

当以指数形式解析BigInteger时,.NET FX代码将指数限制为1000.如果发现指数大于该指数,则会替换指数9999(!!)。请参阅FormatProvider.Number.cs, from line 495。你可以看到自己:

Console.WriteLine(BigInteger.Parse("1e+1000", NumberStyles.AllowExponent).ToString("E", CultureInfo.InvariantCulture)); 
Console.WriteLine(BigInteger.Parse("1e+1001", NumberStyles.AllowExponent).ToString("E", CultureInfo.InvariantCulture)); 

1.000000E + 1000

1.000000E + 9999

即使这不是BigInteger本身的限制,只是一个解析器的限制:

Console.WriteLine((BigInteger.Parse("1e+1000", NumberStyles.AllowExponent) * 10).ToString("E", CultureInfo.InvariantCulture)); 

1.000000E + 1001

我称这种令人惊讶的和不连贯的行为明显的错误,但该行为由一个明确添加一段代码造成的,我无法找到关于BigInteger限制除了确切的规格“arbitrarily large” and “whose value in theory has no upper or lower bounds”

+0

谢谢!你能提出一些解决方法吗?我可以做些什么来初始化BigInteger,其值例如是10^100000? – TimeCoder

+0

@TimeCoder你也可以知道10^100000的十六进制值是什么,并将合适的值传递给[接受byte []']的构造函数(https://msdn.microsoft.com/zh-cn/ -us /库/ dd268207(v = vs.110)的.aspx)。 –

+0

@ScottChamberlain这就像是一个悖论,“在没有BigInteger的情况下”计算出10^100000'的价值“。 – Eser