BigInteger.Parse工作不正常

时间:2016-05-12 18:39:03

标签: .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

建议?

1 个答案:

答案 0 :(得分: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

我将这种令人惊讶且不连贯的行为称为明显的错误,但行为是由明确添加的代码引起的,我无法找到除{{3}之外的BigInteger限制的确切规范}}