Поиск количества мест после десятичной точки Double

У меня есть двойное значение:

double a = 4.5565;

Каков самый простой способ вычисления числа цифр после десятичной точки (в этом случае 4).

Я знаю, что я могу преобразовать в строку и сделать split и взять длину. Но есть ли более простой способ?

Ответ 1

Нет простого способа, тем более, что число цифр, математически говоря, может быть намного больше, чем отображаться. Например, 4.5565 фактически хранится как 4.556499999999999772626324556767940521240234375 (благодаря harold для вычисления этого). Вы вряд ли найдете полезное решение этой проблемы.

ИЗМЕНИТЬ

Вы можете придумать какой-то алгоритм, который будет работать следующим образом: если вы вычисляете десятичное представление, вы находите определенное количество девяти (или нулей) подряд, вы округляете (или вниз) до последнего места до начались серии из 9s (или нулей). Я подозреваю, что вы найдете больше проблем по этой дороге, чем вы ожидали.

Ответ 2

var precision = 0;
var x = 1.345678901m;

while (x*(decimal)Math.Pow(10,precision) != 
         Math.Round(x*(decimal)Math.Pow(10,precision))) 
   precision++;

precision будет равно числу значащих цифр десятичного значения (установка x на 1.23456000 приведет к точности 5, хотя 8 цифр были первоначально указаны в литерале). Это выполняется во времени, пропорциональном количеству знаков после запятой. Он подсчитывает количество дробных цифр ТОЛЬКО; вы можете подсчитать количество мест слева от десятичной точки, взяв целую часть Math.Log10 (x). Он лучше всего работает с десятичными знаками, так как они имеют лучшую точность, поэтому существует меньше ошибок округления.

Ответ 3

Напишите функцию

int CountDigitsAfterDecimal(double value)
        {
            bool start = false;
            int count = 0;
            foreach (var s in value.ToString())
            {
                if (s == '.')
                {
                    start = true;
                }
                else if (start)
                {
                    count++;
                }
            }

            return count;
        }

Ответ 4

Я думаю, что решение String лучше всего: ((a-(int)a)+"").length-2

Ответ 5

Основываясь на Джеймсе, ответь на вопрос гораздо яснее

int num = dValue.ToString().Length - (((int)dValue).ToString().Length + 1);

num - точное количество цифр после десятичной точки. без включения 0, как это (25.52 0000), в этом случае вы получите num = 2

Ответ 6

Я думаю, что это может быть решением:

 private static int getDecimalCount(double val)
 {
     int i=0;
     while (Math.Round(val, i) != val)
         i++;
     return i;
 }

double val9 = 4.5565d; int count9 = getDecimalCount(val9);//result: 4

Извините за дублирование → fooobar.com/questions/478136/...

Ответ 8

Другим решением будет использование некоторых строковых функций:

private int GetSignificantDecimalPlaces(decimal number, bool trimTrailingZeros = true)
{
  string stemp = Convert.ToString(number);

  if (trimTrailingZeros)
    stemp = stemp.TrimEnd('0');

  return stemp.Length - 1 - stemp.IndexOf(
     Application.CurrentCulture.NumberFormat.NumberDecimalSeparator);
}

Не забудьте использовать System.Windows.Forms для получения доступа к Application.CurrentCulture

Ответ 9

На форуме STSdb ​​есть очень хорошая статья: Число цифр после десятичной точки. Он суммирует многие из известных реализаций - ToString(), полномочия метода 10 и другие более продвинутые подходы. Приведены сравнительные тесты, которые показывают, какой из методов является самым быстрым. Предоставленные решения работают для двух и десятичных типов.