对我来说这很奇怪,但你可以试试这个简短的代码:
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
建议?
答案 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
限制的确切规范}}