Go语言基础包的使用—big包

big包简介

在日常的开发过程中,不可避免的需要使用到超过变量类型的数值计算,在 go 语言中,int64 类型的变量的储存范围是 -9223372036854775808 ~ 9223372036854775807,当我们需要计算的数值大于这个范围之后,计算出的结果就会出错,这时候就需要使用到 go 语言中专门为大数计算而存在的标准库:math/big 包里面的内容。

示例

func main() {
 a := math.MaxInt64
 b := math.MaxInt64
 c := a + b
 fmt.Printf("%d + %d = %d", a, b, c)
}

上述代码将两个 int64 的最大值相加,运行结果如下:

Go语言基础包的使用—big包
运行结果

可以看出两个最大值的相加结果异常,这是因为两个最大值相加的结果超出了 int64 能够存储的范围。

math/big

如果需要进行上面这样的大数计算,可以使用 go 语言自带的 math/big 包进行计算,big 包中包含了整形 int 和浮点型 float 的大数计算。

整形

对 big.int 进行计算时,首先需要定义出  big.int ,在 big 包中定义需要使用 NewInt 方法,该方法如下:

func NewInt(x int64) *Int
big1 := big.NewInt(math.MaxInt64)

使用 NewInt 方法返回的是 *Int 类型。

加法

func (z *Int) Add(x, y *Int) *Int

计算加法需要使用 Add 方法,该方法返回 x + y 的值,将 z 的值设为 x + y ,并返回 x + y。

func main() {
   big1 := big.NewInt(math.MaxInt64)
   big2 := big.NewInt(math.MaxInt64)
   big3 := big1.Add(big1, big2)
   fmt.Println(big1)
   fmt.Println(big3)
}

运行结果如下:

Go语言基础包的使用—big包
运行结果

首先定义了两个 big.int类型 big1 和 big2,并赋值为 int64 的最大值,然后对两个数进行相加计算,计算之后可以看到操作数 big1 的值被重置为了 big1 + big2 的值,同时该方法还返回了 big1 + big2 的值给 big3。

减法

func (z *Int) Sub(x, y *Int) *Int

计算减法使用 Sub 方法,方法返回值和 Add 方法相同,下面的代码计算了 int64 的最小值减去 int64 的最大值的结果。

func main() {
   big1 := big.NewInt(math.MinInt64)
   big2 := big.NewInt(math.MaxInt64)
   big3 := big1.Sub(big1, big2)
   fmt.Println(big1)
   fmt.Println(big3)
}

运行结果如下:

Go语言基础包的使用—big包
运行结果

乘法

func (z *Int) Mul(x, y *Int) *Int

乘法计算使用 Mul 方法,使用方法同上,下面代码计算了两个 int64 的最大值相乘的结果。

func main() {
   big1 := big.NewInt(math.MaxInt64)
   big2 := big.NewInt(math.MaxInt64)
   big3 := big1.Mul(big1, big2)
   fmt.Println(big1)
   fmt.Println(big3)
}

运行结果如下:

Go语言基础包的使用—big包
运行结果

除法

func (z *Int) Div(x, y *Int) *Int

除法计算使用 Div 方法,使用方法同上,下面代码计算两个 int64 的最大值的乘积除以 2 的结果。

func main() {
   big1 := big.NewInt(math.MaxInt64)
   big2 := big.NewInt(math.MaxInt64)
   big3 := big1.Mul(big1, big2)
   big3.Div(big3, big.NewInt(2))
   fmt.Println(big3)
}

运行结果如下:

Go语言基础包的使用—big包
运行结果

字符串

在上面的所有代码中,使用 big.NewInt 定义 *Int 类型的值时,都需要传入一个 int64 的值,假设这时候又一个值 x ,并且这个值是一个超过了 int64 范围的值,并且是字符串类型,这样的话在定义 *Int 类型时就无法将 x 传入进去,这时候就需要使用到另外一种设置值的方法。

func (z *Int) SetString(s string, base int) (*Int, bool)

该方法将 z 设为 s 代表的值,并且返回 bool 表明是否成功,base 为基数,基数必须为 0 或者 2 到 MaxBase(字符串转换函数接受的最大进制) 之间的整数,如果基数为 0,字符串的前缀决定实际的转换基数:”0x”、”0X”表示十六进制;”0b”、”0B”表示二进制;”0″表示八进制;否则为十进制。

func main() {
   big1 := big.NewInt(1)
   big1, ok := big1.SetString("222222222222222222222222222222222222"10)
   if !ok {
      fmt.Println("设置失败")
   }
   fmt.Println(big1)
   big1.Div(big1, big.NewInt(2))
   fmt.Println(big1)
}

上述代码首先 NewInt 了一个值为 1 的 *Int类型变量 big1,然后通过 SetString 方法将 big1 的值设置为 222222222222222222222222222222222222,然后将 big1 除以 2 得到最后的答案,运行结果如下:

Go语言基础包的使用—big包
运行结果

浮点型

浮点型的使用方法同整形一样,唯一有区别的是除法计算不一样,在浮点型中除法计算使用的是 Quo() 方法

func main() {

 fmt.Printf("float最大值:%fn", math.MaxFloat64)

 big1 := big.NewFloat(math.MaxFloat64)
 big2 := big.NewFloat(math.MaxFloat64)

 // 加法
 big1.Add(big1, big2)
 fmt.Printf("加法:%fn", big1)

 // 减法
 big1.Sub(big1, big2)
 fmt.Printf("减法:%fn", big1)

 // 乘法
 big1.Mul(big1, big.NewFloat(2))
 fmt.Printf("乘法:%fn", big1)

 // 除法
 big1.Quo(big1, big.NewFloat(2))
 fmt.Printf("除法:%fn", big1)

}

运行结果如下:

Go语言基础包的使用—big包
运行结果


原文始发于微信公众号(良猿):Go语言基础包的使用—big包

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/215725.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!