Тип big.Int

Тип big.Int представляет целые числа со знаком произвольной точности. В отличие от встроенных типов int, int64 или uint64, он может хранить числа любого размера, ограниченные только доступной памятью. Это делает его незаменимым для задач криптографии, работы с большими факториалами, финансовых расчетов с высокой точностью и других областей, где стандартных типов недостаточно. Для создания нового числа используются функции new(big.Int) или big.NewInt, а для выполнения арифметических операций предоставляются методы, изменяющие сам приемник и возвращающие его для удобства цепочечных вызовов.

Создание и базовые операции

Давайте создадим два больших числа и выполним их сложение:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  a := big.NewInt(1234567890123456789)
  b := big.NewInt(9876543210987654321)

  res := new(big.Int).Add(a, b)
  fmt.Println(res)
}

Результат выполнения кода:

go11111111101111111110

Обратите внимание, что метод Add принимает два аргумента и сохраняет результат в вызывающем объекте. В примере мы создали новый big.Int через new и сразу выполнили сложение, что является идиоматичным подходом.

Преобразование из строки

Часто большие числа приходят в виде строк. Для их парсинга используется метод SetString, который принимает основание системы счисления:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  num := new(big.Int)
  num.SetString("123456789012345678901234567890", 10)

  fmt.Println(num)
}

Результат выполнения кода:

go123456789012345678901234567890

Метод SetString возвращает булево значение, указывающее на успешность парсинга, что позволяет обрабатывать ошибки преобразования.

Умножение больших чисел

Метод Mul позволяет перемножать большие числа, сохраняя точность:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  a := big.NewInt(123456789)
  b := big.NewInt(987654321)

  res := new(big.Int).Mul(a, b)
  fmt.Println(res)
}

Результат выполнения кода:

go121932631112635269

Как видите, результат умножения полностью помещается в big.Int, в отличие от стандартных типов, где могло бы произойти переполнение.

Сравнение двух чисел

Для сравнения чисел используется метод Cmp, который возвращает -1, 0 или 1, если первое число меньше, равно или больше второго:

gopackage main

import (
  "fmt"
  "math/big"
)

func main() {
  a := big.NewInt(100)
  b := big.NewInt(200)

  res := a.Cmp(b)
  fmt.Println(res)
}

Результат выполнения кода:

go-1

Этот метод часто используется в условных операторах для принятия решений на основе сравнения больших чисел.

Смотрите также

  • функцию big.NewInt,
    которая создает новое большое целое число из int64
  • метод big.Int.SetString,
    который парсит строку в большое целое число
  • метод big.Int.Cmp,
    который сравнивает два больших целых числа
  • тип big.Float,
    который предоставляет числа с плавающей точкой произвольной точности