Использование целочисленных чисел и чисел с плавающей запятой в C#

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

Совет

Чтобы вставить фрагмент кода в режим фокусировки , используйте сочетание клавиш (CTRL + v или cmd + v).

Предварительные требования

Для работы с руководством вам потребуется компьютер, настроенный для разработки в локальной среде. Инструкции по установке и общие сведения о разработке приложений в .NET см. в статье Настройка локальной среды .

Если вы не хотите настраивать локальную среду, ознакомьтесь с интерактивной версией этого руководства в браузере.

Вычисления с целыми числами

Создайте каталог с именем numbers-quickstart. Сделайте его текущим и выполните следующую команду:

dotnet new console -n NumbersInCSharp -o .

Важно!

В шаблонах C# для .NET 6 используются операторы верхнего уровня. Приложение может не соответствовать коду, приведенному в этой статье, если вы уже выполнили обновление до .NET 6. Дополнительные сведения см. в статье Новые шаблоны C# для создания инструкций верхнего уровня.

Пакет SDK для .NET 6 также добавляет набор неявныхglobal using директив для проектов, использующих следующие пакеты SDK:

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

Эти неявные директивы global using включают наиболее распространенные пространства имен для соответствующего типа проектов.

Дополнительные сведения см. в статье о директивах неявного использования.

Откройте файл Program.cs в любом редакторе и замените содержимое файла следующим кодом:

int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);

Чтобы выполнить этот код, введите dotnet run в окно командной строки.

Вы увидели одну из основных математических операций с целыми числами. Тип int представляет целое положительное или отрицательное число или ноль. Для сложения используйте символ +. Другие стандартные математические операции с целыми числами включают:

  • - — вычитание;
  • * — умножение;
  • / — деление.

Начните с ознакомления с различными операциями. Добавьте следующие строки после строки, с помощью которой записывается значение c:

// subtraction
c = a - b;
Console.WriteLine(c);

// multiplication
c = a * b;
Console.WriteLine(c);

// division
c = a / b;
Console.WriteLine(c);

Чтобы выполнить этот код, введите dotnet run в окно командной строки.

Можно также поэкспериментировать, написав несколько математических операций в одной строке. Например, выполните c = a + b - 12 * 17;. Допускается сочетание переменных и постоянных чисел.

Совет

Вероятнее всего, при изучении C# (как и любого другого языка программирования) вы будете допускать ошибки в коде. Компилятор найдет эти ошибки и сообщит вам о них. Если результат содержит сообщения об ошибках, внимательно просмотрите пример кода и код в окне, чтобы понять, что нужно исправить. Это упражнение поможет вам изучить структуру кода C#.

Вы завершили первый этап. Прежде чем перейти к следующему разделу, переместим текущий код в отдельный метод. Метод — это последовательность инструкций, сгруппированных под одним именем. Чтобы вызвать метод, нужно указать имя метода и () после него. Упорядочение кода в методы упростит работу с новым примером. В результате ваш код должен выглядеть примерно следующим образом:

WorkWithIntegers();

void WorkWithIntegers()
{
    int a = 18;
    int b = 6;
    int c = a + b;
    Console.WriteLine(c);


    // subtraction
    c = a - b;
    Console.WriteLine(c);

    // multiplication
    c = a * b;
    Console.WriteLine(c);

    // division
    c = a / b;
    Console.WriteLine(c);
}

Строка WorkWithIntegers(); вызывает метод. Код после этой строки объявляет метод и определяет его.

Изучение порядка операций

Закомментируйте вызов WorkingWithIntegers(). Это поможет упорядочить выходные данные в этом разделе.

//WorkWithIntegers();

// запускает комментарий в C#. Комментарии — это любой текст, который должен быть сохранен в исходном коде, но не должен выполняться как код. Компилятор не создает исполняемый код из комментариев. Так как WorkWithIntegers() является методом, необходимо закомментировать только одну строку.

Язык C# определяет приоритет математических операций в соответствии с правилами математики. Умножение и деление имеют приоритет над сложением и вычитанием. Убедитесь в этом, добавив следующий код после вызова WorkWithIntegers() и выполнив dotnet run:

int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);

В выходных данных видно, что умножение выполняется раньше сложения.

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

d = (a + b) * c;
Console.WriteLine(d);

Поэкспериментируйте, объединяя различные операции. Добавьте строки, как показано ниже. Выполните dotnet run еще раз.

d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);

Возможно, вы заметили интересное поведение целых чисел. Деление целых чисел всегда дает результат в виде целого числа, даже если ожидаемый результат содержит десятичную или дробную часть.

Если вы еще не видели пример такого поведения, выполните следующий код:

int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);

Выполните dotnet run еще раз, чтобы просмотреть результаты.

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

// WorkWithIntegers();
OrderPrecedence();

void WorkWithIntegers()
{
    int a = 18;
    int b = 6;
    int c = a + b;
    Console.WriteLine(c);


    // subtraction
    c = a - b;
    Console.WriteLine(c);

    // multiplication
    c = a * b;
    Console.WriteLine(c);

    // division
    c = a / b;
    Console.WriteLine(c);
}

void OrderPrecedence()
{
    int a = 5;
    int b = 4;
    int c = 2;
    int d = a + b * c;
    Console.WriteLine(d);

    d = (a + b) * c;
    Console.WriteLine(d);

    d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
    Console.WriteLine(d);

    int e = 7;
    int f = 4;
    int g = 3;
    int h = (e + f) / g;
    Console.WriteLine(h);
}

Изучение точности и ограничений для целых чисел

В последнем примере вы увидели, что при делении целых чисел результат усекается. Вы можете получить остаток с помощью оператора остатка от деления, который обозначается символом %. Попробуйте выполнить следующий код после вызова метода OrderPrecedence():

int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
int e = (a + b) % c;
Console.WriteLine($"quotient: {d}");
Console.WriteLine($"remainder: {e}");

Тип целых чисел C# характеризуется еще одним отличием от математических целых: тип int имеет минимальные и максимальные ограничения. Чтобы просмотреть эти ограничения, добавьте такой код:

int max = int.MaxValue;
int min = int.MinValue;
Console.WriteLine($"The range of integers is {min} to {max}");

Если при вычислении выводится значение вне этих пределов, возникает условие потери значимости или переполнения. Ответ должен находиться в диапазоне от минимального до максимального значения. Добавьте следующие две строки, чтобы увидеть пример:

int what = max + 3;
Console.WriteLine($"An example of overflow: {what}");

Обратите внимание, что ответ очень близок к минимальному целому числу (отрицательное значение). Он совпадает со значением min + 2. Оператор сложения вызвал переполнение допустимых значений для целых чисел. Ответ является очень большим отрицательным числом, так как переполнение покрывает диапазон от наибольшего целого числа до наименьшего.

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

Работа с типом double

Числовой тип double представляет число с плавающей запятой двойной точности. Эти термины могут быть новыми для вас. Число с плавающей запятой можно использовать для представления нецелых чисел, которые могут быть очень большими или малыми. Число двойной точности — это относительный термин, описывающий количество двоичных разрядов, используемых для хранения значения. Числа двойной точности имеют в два раза больше двоичных символов по сравнению с числами одиночной точности. На современных компьютерах числа двойной точности используются чаще, чем одиночной. Числа одиночной точности объявляются с помощью ключевого слова float. Рассмотрим их. Добавьте следующий код и просмотрите результат:

double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);

Обратите внимание, что ответ включает десятичную долю частного. Попробуйте более сложное выражение с типом double:

double e = 19;
double f = 23;
double g = 8;
double h = (e + f) / g;
Console.WriteLine(h);

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

double max = double.MaxValue;
double min = double.MinValue;
Console.WriteLine($"The range of double is {min} to {max}");

Значения выводятся в экспоненциальном представлении. Число слева от символа E является значащим. Число справа — это показатель степени, который равен 10. Так же, как десятичные числа в математике, значения double в C# могут содержать ошибки округления. Выполните этот код:

double third = 1.0 / 3.0;
Console.WriteLine(third);

Вы знаете, что 0.3 повторяющееся конечное число раз не совпадает с 1/3.

Задача

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

Работа с десятичными типами

Вы уже ознакомились с базовыми числовыми типами в C# — целыми числами и числами типа double. Осталось изучить еще один тип: decimal. Тип decimal имеет меньший диапазон, но большую точность, чем double. Например:

decimal min = decimal.MinValue;
decimal max = decimal.MaxValue;
Console.WriteLine($"The range of the decimal type is {min} to {max}");

Обратите внимание, что диапазон меньше, чем для типа double. Вы можете убедиться в повышении точности при использовании типа decimal, выполнив следующий код:

double a = 1.0;
double b = 3.0;
Console.WriteLine(a / b);

decimal c = 1.0M;
decimal d = 3.0M;
Console.WriteLine(c / d);

Суффикс M возле чисел указывает, что для константы должен использоваться тип decimal. В противном случае компилятор предполагает тип double.

Примечание

Буква M была выбрана потому, что визуально показывает различия между ключевыми словами double и decimal.

Обратите внимание, что при вычислении с использованием типа decimal справа от запятой содержится больше цифр.

Задача

Теперь, когда вы ознакомились с разными числовыми типами, напишите код, который позволяет вычислить площадь круга с радиусом 2,50 см. Помните, что площадь круга равна квадрату радиуса, умноженному на число пи. Подсказка: в .NET есть константа пи Math.PI, которую можно использовать. Math.PI, как и все константы, объявленные в пространстве имен System.Math, — это значение double. По этой причине вместо значений decimal для этой задачи следует использовать double.

Вы должны получить ответ от 19 до 20. Ответ можно просмотреть в готовом примере кода на GitHub.

При желании поэкспериментируйте с другими формулами.

Вы выполнили все задачи краткого руководства по числам в C#. Теперь вы можете выполнить руководство по ветвям и циклам в своей среде разработки.

Дополнительные сведения о числах в C# см. в следующих статьях: