Тип big.Int
Тип big.Int представляет целые числа со знаком произвольной точности. В отличие от встроенных типов int, int64 или uint64, он может хранить числа любого размера, ограниченные только доступной памятью. Это делает его незаменимым для задач криптографии, работы с большими факториалами, финансовых расчетов с высокой точностью и других областей, где стандартных типов недостаточно. Для создания нового числа используются функции new(big.Int) или big.NewInt, а для выполнения арифметических операций предоставляются методы, изменяющие сам приемник и возвращающие его для удобства цепочечных вызовов.
Создание и базовые операции
Давайте создадим два больших числа и выполним их сложение:
package 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)
}
Результат выполнения кода:
11111111101111111110
Обратите внимание, что метод Add принимает два аргумента и сохраняет результат в вызывающем объекте. В примере мы создали новый big.Int через new и сразу выполнили сложение, что является идиоматичным подходом.
Преобразование из строки
Часто большие числа приходят в виде строк. Для их парсинга используется метод SetString, который принимает основание системы счисления:
package main
import (
"fmt"
"math/big"
)
func main() {
num := new(big.Int)
num.SetString("123456789012345678901234567890", 10)
fmt.Println(num)
}
Результат выполнения кода:
123456789012345678901234567890
Метод SetString возвращает булево значение, указывающее на успешность парсинга, что позволяет обрабатывать ошибки преобразования.
Умножение больших чисел
Метод Mul позволяет перемножать большие числа, сохраняя точность:
package 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)
}
Результат выполнения кода:
121932631112635269
Как видите, результат умножения полностью помещается в big.Int, в отличие от стандартных типов, где могло бы произойти переполнение.
Сравнение двух чисел
Для сравнения чисел используется метод Cmp, который возвращает -1, 0 или 1, если первое число меньше, равно или больше второго:
package main
import (
"fmt"
"math/big"
)
func main() {
a := big.NewInt(100)
b := big.NewInt(200)
res := a.Cmp(b)
fmt.Println(res)
}
Результат выполнения кода:
-1
Этот метод часто используется в условных операторах для принятия решений на основе сравнения больших чисел.
Смотрите также
-
функцию
big.NewInt,
которая создает новое большое целое число из int64 -
метод
big.Int.SetString,
который парсит строку в большое целое число -
метод
big.Int.Cmp,
который сравнивает два больших целых числа -
тип
big.Float,
который предоставляет числа с плавающей точкой произвольной точности