go语言之大数

计算机编程经常需要权衡利弊,做相应的取舍,例如浮点数可以存储任意大小的数字,但是会不精确,整数虽然准确,但是取值范围受到限制。go中有个big包可以存储大数据,big.Int存储整数,big.Float存储浮点数,big.Rat存储分数。

创建big.Int使用NewInt函数

abc := big.NewInt(54232432)
cde := big.NewInt(43222233)

但是如果数字超过int64的范围,就不能使用这种方式初始化。需要使用SetString方法,第二个参数代表是十进制。

mn := new(big.Int)
mn.SetString("222000000000000000000000",10)

big.Int进行除法计算使用Div

zz := new(big.Int)
zz.Div(mn,abc)

big.Int这样的大类型虽然能够精确表示大小的数值,但代价是使用起来比int等原生类型要麻烦,并且运行速度会相对较慢。

常量如果需要存储较大的数值时,uint64有时会存储不下。go语言处理常量时的做法和变量时的做法不同,变量默认会定义成int类型,会导致类型溢出,但是常量不会,常量会标记为无类型。

const abc = 10000000000000000000

上面的定义不会报错。所以直接可以使用,无类型的数值常量由big包提供支持。

但是这里需要注意,常量与big.Int值是无法互换的。

const abc = 10000000000000000000
fmt.Println(abc)

这样是无法进行打印的。所以使用明确使用big包也许会把问题简明化。

发表评论

相关文章