#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;