Пока неясно, чего именно вы хотите достичь. Но вы не можете правильно представить любое десятичное число как double
значение.
Скажем, у вас есть число x
, его нужно придерживаться следующей формулой
x = n/m where n and m do not share any factor and m is a power of 2
, чтобы иметь шанс быть точно представимым как двойной.
Таким образом, число 5.9E-12
равно 59/(10^13)
. Вы ясно видите, что 10^13
не является степенью 2, поэтому 5.9E-12
не может быть правильно представлен в виде двойного значения
Если вы сделаете Console.WriteLine("{0:G17}", double.Parse("5.9E-12"));
, вы получите значение 5.9000000000000003E-12
а не 5.9E-12
.
Все это в основном возникает по той же причине, по которой вы не можете записать десятичное расширение 1/3
или 1/7
до конца (без периодического ярлыка).
Поэтому, если вы хотите, чтобы числа, которые можно было округлить до значений с конечным десятичным расширением, используйте decimal
, а не double
.
Или вы можете создать дробный тип на основе BitInteger
это будет иметь неограниченную точность. См. this для обсуждения.