Как округлить двойные значения, чтобы удалить последовательные 9 или 0 - PullRequest
1 голос
/ 21 апреля 2020

, как округлить значения ниже, чтобы удалить последовательные 9 из двойного значения. Значительное di git округление в. Net framework и. net core работает по-разному.

Использовал приведенный ниже код для округления двойного значения до значащих цифр путем передачи значения 5.9E-12 и округления до 12 значащих цифр

  private static double RoundToSignificantDigits(double d, int digits)
         {
             if (d == 0)
                 return 0;

              double scale = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(d))) + 1);
              return scale * Math.Round(d / scale, digits);
         }

. Net основной результат: 5.8999999999999995E-12. Net Framework Результат: 5.9E-12

Как получить результат как. Net рамки в. Net ядро ​​

1 Ответ

0 голосов
/ 21 апреля 2020

Пока неясно, чего именно вы хотите достичь. Но вы не можете правильно представить любое десятичное число как 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 для обсуждения.

...