Отображение очень больших или малых чисел в научной нотации путем подсчета нулей

#c#

#c#

Вопрос:

Мне нужен метод, позволяющий получить количество нулей ПОСЛЕ десятичной точки, когда число ПЕРЕД десятичной точкой также равно нулю. Так, например, 0.00000000987654 будет работать как 8, поскольку после 0 есть 8 нулей. Превратив десятичный тип данных в строку, я мог бы затем отобразить это в научной нотации как 9.87654E9.

Причина, по которой мне нужно это сделать, заключается в том, что я могу многократно повторять очень маленькие числа, получая результаты, слишком высокие для калькуляторов.

Так, например, 0,123456789 умножается на 0,1 и повторяется 1000 раз. (0.123456789 * 0.1 * 0.1 * 0.1 * 0.1 ……) выполняется в 1.234567890000000000000000000E-1001 с использованием десятичного типа данных с точностью до 28 цифр и отображается в научной нотации

Я смог добиться этого при работе с факториалами. Например, факториал 1000 равен 1000 x 999 * 998 * 997 * 996 …. вплоть до 0. Это число слишком велико для калькуляторов, поэтому я использовал итерацию для достижения результата с точностью до 28 цифр в научной нотации.

Для очень больших чисел я добился успеха. Я достиг этого, получив количество цифр ПЕРЕД точкой:

     static int Get_Digits_Before_Period(decimal Large_Number)
    {
        decimal d = decimal.Floor(Large_Number < 0 ? decimal.Negate(Large_Number) : Large_Number);
        // 0.xyz should return 0, therefore a special case
        if (d == 0m)
            return 0;
        int cnt = 1;
        while ((d = decimal.Floor(d / 10m)) != 0m)
            cnt  ;
        return cnt;
    }
  

Теперь мне нужен аналогичный метод, но один для получения количества нулей ПОСЛЕ точки.

Комментарии:

1. Я не уверен, должен ли я опубликовать это в качестве ответа, но я, наконец, создал программу, которая может повторять очень большие или маленькие числа с точностью до 28 цифр. (Например, 2.18961306137446848520669395 E-1376 ) Однако я не могу быть уверен, что точность является точной.

Ответ №1:

Диапазон показателей для десятичной системы счисления равен 0 ~ -28, поэтому он не может представлять число, такое как 1.234567890000000000000000000E-1001, поэтому я просто объясняю числа в допустимых диапазонах.

Чтобы подсчитать НОЛЬ для десятичной дроби, вы можете сначала получить целое число и экспоненциальную часть десятичной дроби

 var number = 0.00000000987654m;
var bits = decimal.GetBits(number); //0~2 are integer part.
var exponent = (bits[3] amp; 0xff0000) >> 16;
  

Затем уменьшите показатель степени на значащие цифры целых чисел, чтобы получить нулевое количество после точки.

 var zeros = exponent;
for(int i = 0; i <= 2; i  )
{
      if(bits[i] != 0)
         zeros -= (int)Math.Log10(bits[i])   1;
}
if(zeros < 0)
    zeros = 0;