BigInteger.Parse 工作不正常

Tim*_*der 4 .net math biginteger

这对我来说很奇怪,但你可以试试这个简短的代码:

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
Run Code Online (Sandbox Code Playgroud)

建议?

Mor*_*gil 5

解析BigInteger指数形式的a时,.NET FX 代码将指数限制为 1000。如果发现比该指数更大的指数,9999则替换为(!!)的指数。请参阅第 495 行中的 FormatProvider.Number.cs。你可以亲眼看看:

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

1.000000E+1000

1.000000E+9999

即使这不是BigInteger自身的限制,也只是解析器的限制:

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

1.000000E+1001

我将这种令人惊讶和不连贯的行为称为明显的错误,但该行为是由明确添加的一段代码引起的,BigInteger除了“任意大”和“其理论上的价值有没有上限或下限”