Функция которая выполняет операцию сложения чисел
Python поддерживает все распространенные арифметические операции:
-
+ Сложение двух чисел:
print(6 + 2) # 8
print(6 - 2) # 4
print(6 * 2) # 12
print(6 / 2) # 3.0
print(7 / 2) # 3.5 print(7 // 2) # 3
print(6 ** 2) # Возводим число 6 в степень 2. Результат - 36
print(7 % 2) # Получение остатка от деления числа 7 на 2. Результат - 1
При последовательном использовании нескольких арифметических операций их выполнение производится в соответствии с их приоритетом. В начале выполняются операции с большим приоритетом. Приоритеты операций в порядке убывания приведены в следующей таблице.
Пусть у нас выполняется следующее выражение:
number = 3 + 4 * 5 ** 2 + 7 print(number) # 110
Здесь начале выполняется возведение в степень (5 ** 2) как операция с большим приоритетом, далее результат умножается на 4 (25 * 4), затем происходит сложение (3 + 100) и далее опять идет сложение (103 + 7).
Чтобы переопределить порядок операций, можно использовать скобки:
number = (3 + 4) * (5 ** 2 + 7) print(number) # 224
Следует отметить, что в арифметических операциях могут принимать участие как целые, так и дробные числа. Если в одной операции участвует целое число (int) и число с плавающей точкой (float), то целое число приводится к типу float.
Арифметические операции с присвоением
Ряд специальных операций позволяют использовать присвоить результат операции первому операнду:
- += Присвоение результата сложения
- -= Присвоение результата вычитания
- *= Присвоение результата умножения
- /= Присвоение результата от деления
- //= Присвоение результата целочисленного деления
- **= Присвоение степени числа
- %= Присвоение остатка от деления
number = 10 number += 5 print(number) # 15 number -= 3 print(number) # 12 number *= 4 print(number) # 48
Округление и функция round
При операциях с числами типа float надо учитывать, что результат операций с ними может быть не совсем точным. Например:
first_number = 2.0001 second_number = 5 third_number = first_number / second_number print(third_number) # 0.40002000000000004
В данном случае мы ожидаем получить число 0.40002, однако в конце через ряд нулей появляется еще какая-то четверка. Или еще одно выражение:
print(2.0001 + 0.1) # 2.1001000000000003
В случае выше для округления результата мы можем использовать встроенную функцию round() :
first_number = 2.0001 second_number = 0.1 third_number = first_number + second_number print(round(third_number)) # 2
В функцию round() передается число, которое надо округлить. Если в функцию передается одно число, как в примере выше, то оно округляется до целого.
Функция round() также может принимать второе число, которое указывает, сколько знаков после запятой должно содержать получаемое число:
first_number = 2.0001 second_number = 0.1 third_number = first_number + second_number print(round(third_number, 4)) # 2.1001
В данном случае число third_number округляется до 4 знаков после запятой.
Если в функцию передается только одно значение — только округляемое число, оно округляется то ближайшего целого
# округление до целого числа print(round(2.49)) # 2 - округление до ближайшего целого 2 print(round(2.51)) # 3
Однако если округляемая часть равна одинаково удалена от двух целых чисел, то округление идет к ближайшему четному:
print(round(2.5)) # 2 - ближайшее четное print(round(3.5)) # 4 - ближайшее четное
Округление производится до ближайшего кратного 10 в степени минус округляемая часть:
# округление до двух знаков после запятой print(round(2.554, 2)) # 2.55 print(round(2.5551, 2)) # 2.56 print(round(2.554999, 2)) # 2.55 print(round(2.499, 2)) # 2.5
Однако следует учитывать, что функция round() не идеальный инструмент. Например, выше при округление до целых чисел применяется правило, согласно которому, если округляемая часть одинаково удалена от двух значений, то округление производится до ближайшего четного значения. В Python в связи с тем, что десятичная часть числа не может быть точно представлена в виде числа float, то это может приводить к некоторым не совсем ожидаемым результатам. Например:
# округление до двух знаков после запятой print(round(2.545, 2)) # 2.54 print(round(2.555, 2)) # 2.56 - округление до четного print(round(2.565, 2)) # 2.56 print(round(2.575, 2)) # 2.58 print(round(2.655, 2)) # 2.65 - округление не до четного print(round(2.665, 2)) # 2.67 print(round(2.675, 2)) # 2.67
Подобно о проблеме можно почитать к документации.
Функция которая выполняет операцию сложения чисел
Арифметические операции производятся над числами. Значения, которые участвуют в операции, называются операндами. В языке программирования C++ арифметические операции могут быть бинарными (производятся над двумя операндами) и унарными (выполняются над одним операндом). К бинарным операциям относят следующие:
-
+ Операция сложения возвращает сумму двух чисел:
int a ; int b ; int c ; // 17 int d ; // 11
В этом примере результат операций применяется для инициализации переменных, но мы также можем использовать операцию присвоения для установки значения переменных:
int a ; int b ; int c = a + b; // 17 int d = 4 + b; // 11
int a ; int b ; int c ; // 3 int d ; // -3
int a ; int b ; int c ; // 70 int d ; // 28
int a ; int b ; int c ; // c = 5 int d ; // d = 0
При делении стоит быть внимательным, так как если в операции участвуют два целых числа, то дробная часть (при ее наличии) будет отбрасываться, даже если результат присваивается переменной float или double :
#include int main() < int a ; int b ; float c ; // c = 5 double d ; // d = 0 std::cout #include int main() < float a ; int b ; float c ; // c = 5.2 double d ; // d = 0.8 std::cout %Операция получения остатка от целочисленного деления:
int a ; int b ; int c ; // c = 26 % 5 = 26 - 5 * 5 = 1 int d ; // d = 4 % 5 = 4Некоторые особенности при работе с числами с плавающей точкой
При сложении или вычитании чисел с плавающей точкой, которые сильно отличаются по значению, следует проявлять осторожность. Например, сложим число 1.23E-4 ( 0.000123 ) и 3.65E+6 (3650000). Мы ожидаем, что сумма будет равна 3650000,000123 . Но при преобразовании в число с плавающей запятой с точностью до семи цифр это становится следующим
3.650000E+06 + 1.230000E-04 = 3.650000E+06Или соответствующий код на С++:
#include int main() < float num1< 1.23E-4 >; // 0.000123 float num2< 3.65E+6 >; // 3650000 float sum ; // sum =3.65e+06 std::cout
То есть первое число никак не изменилось, поскольку для хранения точности отводится только 7 цифр.
Также стоит отметить, что стандарт IEEE, который реализуется компиляторами С++, определяет специальные значения для чисел с плавающей точкой, в которых мантисса на бинарном уровне состоит только из нулей, а экспонента, которая состоит из одних единиц, в зависимости от знака представляет значения +infinity (плюс бесконечность +∞) и -infinity (минус бесконечность -∞). И при делении положительного числа на ноль, результатом будет +infinity , а при делении отрицательного числа на ноль - -infinity .
Другое специальное значение с плавающей точкой, определенное этим стандартом, представляет значение NaN (не число). Это значение представляет результат операции, который не определяется математически, например, когда ноль делится на ноль или бесконечность на бесконечность. Результатом любой операции, в которой один или оба операнда являются NaN , также является NaN .
Для демонстрации рассмотрим следующую программу:
#include int main() < double a< 1.5 >, b<>, c<>, d ; double result < a / b >; std::cout1.5/0 = inf -1.5/0 = -inf 0/0 = nan nan + 1.5 = nanИнкремент и декремент
Также есть две унарные арифметические операции, которые производятся над одним числом: ++ (инкремент) и -- (декремент). Каждая из операций имеет две разновидности: префиксная и постфиксная:
-
Префиксный инкремент . Увеличивает значение переменной на единицу и полученный результат используется как значение выражения ++x
#include int main() < int a ; int b <++a>; std::cout Постфиксный инкремент.Увеличивает значение переменной на единицу, но значением выражения x++ будет то, которое было до увеличения на единицу
#include int main() < int a ; int b ; std::cout Префиксный декремент.Уменьшает значение переменной на единицу, и полученное значение используется как значение выражения --x
#include int main() < int a ; int b ; std::cout Постфиксный декремент.Уменьшает значение переменной на единицу, но значением выражения x-- будет то, которое было до уменьшения на единицу
#include int main() < int a ; int b ; std::cout левоассоциативными - такие операторы выполняются слева направо и правоассоциативными - выполняются справа налево. Подавляющее большинство операторов левоассоциативны (например, бинарные арифметические операции), поэтому большинство выражений оценивается слева направо. Правоассоциативными операторами являются все унарные операторы, различные операторы присваивания и условный оператор.Кроме того, одни операции имеют больший приоритет, чем другие и поэтому выполняются вначале. Операции в порядке уменьшения приоритета:
| ++ (инкремент), -- (декремент) |
| * (умножение), / (деление), % (остаток от деления) |
| + (сложение), - (вычитание) |
Приоритет операций следует учитывать при выполнении набора арифметических выражений:
int a = 8; int b = 7; int c = a + 5 * ++b; // 48
Хотя операции выполняются слева направо, но вначале будет выполняться операция инкремента ++b , которая увеличит значение переменной b и возвратит его в качестве результата, так как эта операция имеет больший приоритет. Затем выполняется умножение 5 * ++b , и только в последнюю очередь выполняется сложение a + 5 * ++b Следует учитывать, что если в одной инструкции для одной переменной сразу несколько раз вызываются операции инкремента и декремента, то результат может быть неопределенным, и много зависит от конкретного компилятора. Например:
int count ; int result = ++count * 3 + count++ * 5;
Так, и g++, и clang++ скомпилируют данный код, и результат переменной result будет таким, как в принципе и ожидается - 16, но компилятор clang++ также сгенерирует предупреждение.
Переопределение порядка операций
Функция которая выполняет операцию сложения чисел
Все еще не понимаю как компилятор читает код. Вроде как слева направо, но присвоение идет справа налево. А когда идет постфик++ сначала справа налево, а потом слева направо. Как так работает, что у = сначала х, а только потом х++. Почему она сразу не присваивает? Вообщем, мне кажется нужна подробная лекция или объяснение о всей сути чтения программ.
20 декабря 2023
После выражения public static void main(String[] args) < слова "для краткости записи" вызывают нервный тик.
Neona Уровень 10
4 ноября 2023
Насчёт инкремента и декремента. 1.Постфиксная форма записи это i++. То есть переменной i сначала возвращается текущее значение, а после уже значение i увеличивается на 1. 2.Префиксная форма записи это ++i, то есть сразу значение i увеличится на 1, и после этого сразу же присвоится переменной i.
1 ноября 2023
а как работает %= . остаток от деления х на у?
4 августа 2023

Здесь нет ошибки? Все корректно? Не совсем понятно как будет работать,если будет например 7 чисел,как будет работать сравнение?? По логике просто слева направо должно,а здесь все запутно
Anonymous #3334737 Уровень 10
2 августа 2023
Если проще про постфиксный/префиксный инкремент: (X++) Сначала возвращается текущее значение X (9) для использования в выражении, а затем значение X увеличивается на 1. После выполнения X++,X становится равным 10 (++X) Сначала значение X увеличивается на 1, а затем новое значение (10) возвращается для использования в выражении. После выполнения ++X, X становится равным 10. p.s мог где-то ошибку допустить но всё вроде так)
Выполнение математических операций в Go с помощью операторов

Числа используются повсюду в программировании. Они используются для представления таких вещей, как размеры экрана, географическое местоположение, денежные средства и баллы, количество времени, передаваемого в видео, расположение игровых аватаров, отображение цветов через присвоение числовых кодов и т. д.
Эффективное выполнение математических операций в программировании является важным навыком, который необходимо развивать, поскольку вы очень часто будете работать с числами. Хотя понимание математических операций на высоком уровне может помочь вам стать более профессиональным программистом, это не является обязательным условием. Если у вас нет опыта работы с математическими операциями, попробуйте посмотреть на математику как на инструмент, с помощью которого вы можете добиться того, чего хотите, и как на способ улучшить ваше логическое мышление.
Мы будем работать с двумя наиболее используемыми типами данных Go, int и float:
- Int — это целое число, которое может быть положительным, отрицательным или 0 (… -1 , 0 , 1 …).
- Float — вещественные числа с десятичными дробями, например, 9,0 или -2,25 .
В этом обучающем руководстве мы изучим операторы, которые мы можем использовать с числовыми типами данных в Go.
Операторы
Оператор — это символ или функция, указывающая операцию. Например, в математике значок плюс или + — это оператор сложения.
В Go мы увидим несколько похожих операторов, которые взяты из математики. Однако другие операторы, которые мы будем использовать, принадлежат только к компьютерному программированию.
Здесь вы можете найти таблицу с математическими операторами в Go. Мы рассмотрим все эти операторы в рамках данного руководства.
| Операция | Что возвращает |
|---|---|
| x + y | Сумма x и y |
| x - y | Разница между x и y |
| -x | Изменение знака x |
| +x | Тождественность x |
| x * y | Произведение x и y |
| x / y | Результат деления x на y |
| x % y | Остаток деления x на y |
Также мы рассмотрим составные операторы присваивания, включая += и *= , которые совмещают арифметический оператор с оператором = .
Сложение и вычитание
В Go операторы сложения и вычитания работают так же, как и в математике. По сути, вы можете использовать язык программирования Go как калькулятор.
Давайте рассмотрим несколько примеров, начиная с целых чисел:
fmt.Println(1 + 5)
Output6
Вместо передачи целых чисел прямо в оператор fmt.Println мы можем инициализировать переменные для хранения целочисленных значений, используя следующий синтаксис:
a := 88 b := 103 fmt.Println(a + b)
Output191
Поскольку целые числа могут быть как положительными, так и отрицательными (как и 0), мы можем добавить отрицательное число к положительному:
c := -36 d := 25 fmt.Println(c + d)
Output-11
Сложение будет работать аналогичным образом для чисел с плавающей точкой:
e := 5.5 f := 2.5 fmt.Println(e + f)
Output8
Поскольку мы складывали два числа с типом float, Go возвращает float с дробной частью. Однако, поскольку в этом случае десятичная часть равна 0, fmt.Println опускает десятичную часть. Чтобы надлежащим образом настроить формат вывода, мы будем использовать fmt.Printf с %.2f для форматирования числа с двумя знаками после запятой, как это показано в данном примере:
fmt.Printf("%.2f", e + f)
Output8.00
Синтаксис для вычитания аналогичен сложению, кроме того, что мы изменяем оператор со знака плюс ( + ) на знак минус ( - ):
g := 75.67 h := 32.0 fmt.Println(g - h)
Output43.67
В Go мы можем использовать операторы только для одинаковых типов данных. Мы не можем складывать int и float64 :
i := 7 j := 7.0 fmt.Println(i + j)
Outputi + j (mismatched types int and float64)
При попытке использовать операторы с типами данных, не являющимися одинаковыми, вы получите ошибку компиляции.
Унарные арифметические операторы
Унарные математические выражения включают только один компонент или элемент. В Go мы можем использовать знаки плюс и минус как один элемент со значением, в частности, для возврата тождественности значения ( + ) или изменения знака значения ( - ).
Хотя обычно это не используется, значок плюс указывает тождественность значения. Мы можем использовать знак плюс с положительными значениями:
i := 3.3 fmt.Println(+i)
Output3.3
Когда мы используем знак плюс с отрицательным значением, он будет возвращать тождественность этого значения, а в данном случае это будет отрицательное значение:
j := -19 fmt.Println(+j)
Output-19
При отрицательном значении знак плюс возвращает то же самое отрицательное значение.
Знак минус, однако, изменяет знак значения. Поэтому при передаче положительного значения мы обнаружим, что знак минус, который идет перед значением, будет возвращать отрицательное значение:
k := 3.3 fmt.Println(-k)
Output-3.3
Также, когда мы используем унарный минус с отрицательным значением, будет возвращаться положительное значение:
j := -19 fmt.Println(-j)
Output19
Унарные арифметические операции со знаком плюс и знаком минус возвращают либо тождественность значения в случае +i или значение с противоположным знаком в случае -i .
Умножение и деление
Как и сложение и вычитание, умножение и деление будут выглядеть примерно так, как в математике. Знак, который мы используем в Go для умножения — это * , а знак, который мы используем для деления — это / .
Здесь приведен пример выполнения умножения в Go двух чисел с плавающей запятой:
k := 100.2 l := 10.2 fmt.Println(k * l)
Output1022.04
В Go деление имеет разные характеристики в зависимости от типа числового значения, на которое мы делим.
Если мы делим целые числа, оператор / Go выполняет обычное деление, где для целой части x возвращаемое число — это самое большое число, которое меньше или равно x.
Если вы запустите следующий пример с делением 80 / 6 , вы получите 13 в качестве результата, а типом данных будет int :
package main import ( "fmt" ) func main() m := 80 n := 6 fmt.Println(m / n) >
Output13
Если желаемый результат вывода — float, вы должны явно преобразовывать значения, прежде чем выполнять деление.
Вы можете сделать это, обернув желаемый тип float32() или float64() вокруг ваших значений:
package main import ( "fmt" ) func main() s := 80 t := 6 r := float64(s) / float64(t) fmt.Println(r) >
Output13.333333333333334
Модуль
Оператор % — это модуль, который возвращает остаток, а не целую часть после деления. Это полезно для получения чисел, умножающихся на одно и то же число.
Давайте рассмотрим пример модуля:
o := 85 p := 15 fmt.Println(o % p)
Output10
Например, 85 при делении на 15 возвращает целое число 5 с остатком 10 . Наша программа возвращает значение 10 , поскольку оператор модуля возвращает остаток от деления.
Для выполнения вычисления модуля с типом данных float64 вы будете использовать функцию Mod из пакета math :
package main import ( "fmt" "math" ) func main() < q := 36.0 r := 8.0 s := math.Mod(q, r) fmt.Println(s) >
Output4
Приоритет операций
В Go, как и в математике, мы должны помнить, что операторы будут оцениваться по порядку приоритета, а не в порядке слева направо или справа налево.
Если мы рассмотрим следующее математическое выражение:
u = 10 + 10 * 5
Мы можем прочитать его слева направо, но сначала будет выполняться умножение, так что если бы мы выводили u , то получили бы следующее значение:
Output60
Это объясняется тем, что 10 * 5 дает 50 , а затем мы добавляем 10 для получения 60 в качестве результата.
Если же мы хотим добавить значение 10 к 10 , а затем умножить сумму на 5 , нужно использовать скобки в Go, как это делается в математике:
u := (10 + 10) * 5 fmt.Println(u)
Output100
Одним из способов, с помощью которого можно запомнить порядок операций, является акроним PEMDAS:
| Порядок | Символ | Значение |
|---|---|---|
| 1 | P | Parentheses (скобки) |
| 2 | E | Exponent (степень) |
| 3 | M | Multiplication (умножение) |
| 4 | D | Division (деление) |
| 5 | A | Addition (сложение) |
| 6 | S | Subtraction (вычитание) |
Вы можете быть знакомы с другим акронимом для порядка операций, например, BEDMAS или BODMAS. Какой бы акроним вам ни подошел, попробуйте держать его в уме, когда вы будете выполнять математические операции в Go, чтобы получить результаты, которые вы ожидаете.
Операторы присвоения
Самый распространенный оператор присвоения — это тот, который вы уже использовали: знак равенства = . Оператор присвоения = присваивает значение справа переменной слева. Например, v = 23 присваивает значение 23 переменной v .
При программировании обычно используются составные операторы присвоения, выполняющие операцию со значением переменной, а затем присваивают новое полученное значение этой переменной. Эти составные операторы объединяют арифметические операторы с опертором = . Поэтому для сложения мы соединим + и = для получения составного оператора += . Давайте посмотрим, как это выглядит:
w := 5 w += 1 fmt.Println(w)
Output6
Во-первых, мы зададим переменную w равной 5 , а затем используем составной оператор += для добавления нужного числа переменной слева, а затем присвоим результат переменной w .
Составные операторы присвоения используются в циклах for , которые вы используете, когда хотите повторить процесс несколько раз:
package main import "fmt" func main() values := []int0, 1, 2, 3, 4, 5, 6> for _, x := range values w := x w *= 2 fmt.Println(w) > >
Output0 2 4 6 8 10 12
Используя цикл for для прохождения по срезу values , вы можете автоматизировать процесс для оператора *= , который умножает переменную w на число 2 , а затем присваивает результат переменной w .
Go имеет составной оператор присвоения для каждого из арифметических операторов, описанных в этом обучающем руководстве.
Чтобы добавить, а затем присвоить значение:
y += 1
Чтобы вычесть, а затем присвоить значение:
y -= 1
Чтобы умножить, а затем присвоить значение:
y *= 2
Чтобы разделить, а затем присвоить значение:
y /= 3
Чтобы вернуть остаток, а затем присвоить значение:
y %= 3
Составные операторы присвоения могут быть полезными, когда нужно инкрементировать или декрементировать значение, или при необходимости автоматизировать определенные процессы в вашей программе.
Заключение
В этом обучающем руководстве мы познакомились с множеством операторов, которые вы будете использовать с целыми числами или числами с плавающей точкой. Вы можете узнать больше о разных типах данных в статьях Знакомство с типами данных в Go и Конвертация типов данных.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.