Отображение значимых цифр в C#

Число значащих цифр в числе - это число цифр, которые содержат значимую информацию. К ним относятся все отображаемые цифры, кроме начальных и конечных нулей. Десятичная точка и конечные нули после десятичной точки означают, что цифры перед ними значительны.

Например, значение 12 000 имеет 2 значащих цифры: 1 и 2. То, что это интуитивно означает, что это значение составляет 12 000 с точностью до 1000.

Напротив, значение 12 000,0 имеет 6 значащих цифр. 0 после десятичной точки означает, что он и цифры перед ним значительны.

Есть несколько темных областей. Например, предположим, что вы действительно знаете значение 12 000 до ближайшего 100. Как вы можете это представить? Единственное, что я знаю для этого, - это отметить факт или использовать научную нотацию. Конечное значение 0 в коэффициенте 1.230e4 означает, что это значащая цифра.

В этом примере используется следующий метод расширения, чтобы преобразовать значение double в строку с указанным числом значимых цифр.

// Отформатируйте значение с указанным количеством значимых цифр.
public static string ToSignificantDigits(
    this double value, int significant_digits)
{
    // Используйте формат G для получения значительных цифр.
    // Затем преобразуем в double и используйте формат F.
    string format1 = "{0:G" + significant_digits.ToString() + "}";
    string result = Convert.ToDouble(
        String.Format(format1, value)).ToString("F99");

    // Rmove trailing 0s.
    result = result.TrimEnd('0');

    // Rmove десятичная точка и ведущая 0s,
    // оставив только цифры.
    string test = result.Replace(".", "").TrimStart('0');

    // Посмотрим, есть ли у нас достаточно значительных цифр.
    if (significant_digits > test.Length)
    {
        // Добавить завершающие 0s.
        result += new string('0', significant_digits - test.Length);
    }
    else
    {
        // См., Следует ли удалять конечную десятичную точку.
        if ((significant_digits < test.Length) &&
            result.EndsWith("."))
                result = result.Substring(0, result.Length - 1);
    }

    return result;
}

Код составляет строку формата формы {0: G4}, где 4 - желаемое количество значащих цифр. Затем код передает этот спецификатор формата методу String.Format, чтобы получить значение double, отформатированное с правильным количеством значимых цифр.

Спецификатор формата G дает желаемое количество значащих цифр, но не включает в себя завершение 0 и может использовать научную нотацию, если это дает более короткий результат.

Чтобы исправить эти проблемы, код использует Convert.ToDouble, чтобы преобразовать полученную строку обратно в double. Затем он использует формат F99 для преобразования double в строку с фиксированной точкой (не научная нотация) с 99 цифрами (самая длинная строка, которую может создать формат). Затем код сбрасывает конечные 0s.

В этот момент результат выглядит как правильное значение, но может не иметь правильного количества значимых цифр, если требуются конечные 0. Чтобы добавить конечные 0s, он создает тестовую строку и удаляет ее десятичную точку, а ведущие и конечные 0s оставляют только значимые цифры. Код вычитает длину этой строки из числа требуемых значимых цифр и при необходимости добавляет конечные значения 0s к окончательному результату.

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

double number = double.Parse(txtNumber.Text);
int num_digits = (int)nudDigits.Value;
txtResult.Text = number.ToSignificantDigits(num_digits);

string format = "{0:G" + num_digits.ToString() + "}";
txtGFormat.Text = String.Format(format, number);

Код получает число и количество значащих цифр. Затем он вызывает метод ToSignificantDigits номера для форматирования значения. Код также отображает результат формата G, чтобы вы могли видеть разницу.

Отображение значимых цифр похоже на то, что это должна быть простая концепция, но это удивительно сложно. Вы можете попробовать несколько примеров в отладчике, чтобы увидеть, как это работает. Также было бы неплохо, если бы в классы форматирования Framework была включена эта функция.

Это также объясняет, как вы находите число значимых цифр в расчете. Например, рассмотрим выражение 8 & times; 8,0. Значение 8 имеет одну значащую цифру, но значение 8.0 имеет две значащие цифры. Когда вы умножаете два значения, результат равен 64, но это значение означает, что результат имеет две цифры точности. Поскольку значение 8 имеет только одну значащую цифру, результат может иметь только одну значащую цифру, поэтому правильный результат равен 60.

Источник: http://csharphelper.com/blog/2016/07/display-significant-digits-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector