计算机编程经常需要权衡利弊,做相应的取舍,例如浮点数可以存储任意大小的数字,但是会不精确,整数虽然准确,但是取值范围受到限制。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包也许会把问题简明化。
还有一个问题是如果无类型当做函数参数时,函数是无法定义的,需要把无类型参数转换为有类型参数。