System.Double
имеет только 15 десятичных цифр точности, что означает, что значение будет близко к фактическому значению, но может быть неточным.
Все это связано с тем, как значения с плавающей запятой кодируются, чтобы занимать фиксированный объем памяти.
Это точно такая же проблема, которая позволяет 1.0
в конечном итоге получить 0.999999999999999999etc
.
Если вам нужна абсолютная точность, вам нужно использовать библиотеку / тип, который имеет это, double
не имеет.
Для вашего конкретного кода вы можете сделать это:
BigInteger bigBase = BigInteger.Pow(1000, 99);