Обратите внимание, что вы находитесь в пределах точности типа данных Double здесь, что означает, что вычисления здесь не будут точными.
Пример:
d1 = 4.271343859532459e+18
, что можно сказать так же, как:
d1 = 4271343859532459000
и так:
d1 * i1 = 21356719297662295000
на самом деле значение в .NET будет выглядеть примерно так:
2.1356719297662296E+19
Обратите внимание на округление там. Следовательно, на этом уровне вы не получаете правильных ответов.