我有两个将大数字设置为字符串的变量:
var numA = "340282366920938463463374607431768211456"
var numB = "17014118346046923173168730371588410572"
我希望能够在Go中添加和减去这类大字符串。
我知道我需要使用math/big
,但是我仍然无法确定如何使用它,因此任何示例帮助将不胜感激!
答案 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