Это связано с точностью и округлением.
Эта строка:
Console.WriteLine((int)BigInteger.Log10(bi1000));
округляет значение 2.9999999999999996 до 2, тогда как Console.WriteLine
записывает это значение как 3
Вы можете проверить это, используя промежуточную переменную double
и проверив ее значение:
double x = BigInteger.Log10(bi1000);
Console.WriteLine((int)x);