加/减两个数字字符串

时间:2018-07-05 06:43:55

标签: go math biginteger

我有两个将大数字设置为字符串的变量:

var numA = "340282366920938463463374607431768211456"
var numB = "17014118346046923173168730371588410572"

我希望能够在Go中添加和减去这类大字符串。

我知道我需要使用math/big,但是我仍然无法确定如何使用它,因此任何示例帮助将不胜感激!

1 个答案:

答案 0 :(得分:8)

您可以使用big.NewInt()创建一个新的big.Int值,并使用int64进行初始化。它返回一个指针(*big.Int)。另外,您可以简单地使用内置的new()函数来分配big.Int的值0,如下所示:new(big.Int),或者因为big.Int是结构类型,简单的composite literal也会做:&big.Int{}

一旦有了值,就可以使用Int.SetString()进行解析并设置一个数字为string。您可以传递字符串号的基数,它还会返回一个bool值,指示解析是否成功。

然后,您可以使用Int.Add()Int.Sub()来计算2个big.Int的和。请注意,Add()Sub()将结果写入要调用其方法的接收器中,因此,如果您需要数字(操作数)不变,请使用另一个big.Int值来计算和存储结果。

请参见以下示例:

numA := "340282366920938463463374607431768211456"
numB := "17014118346046923173168730371588410572"

ba, bb := big.NewInt(0), big.NewInt(0)
if _, ok := ba.SetString(numA, 10); !ok {
    panic("invalid numA")
}
if _, ok := bb.SetString(numB, 10); !ok {
    panic("invalid numB")
}

sum := big.NewInt(0).Add(ba, bb)
fmt.Println("a + b =", sum)

diff := big.NewInt(0).Sub(ba, bb)
fmt.Println("a - b =", diff)

输出(在Go Playground上尝试):

a + b = 357296485266985386636543337803356622028
a - b = 323268248574891540290205877060179800884