How to work with large integers in Go?

2019-10-03 08:15发布

I need to perform operations, such as exponentiation and division, on large values of int64 in Go, but I have problems with overflow. I tried converting them to float64, but then I run into other problems. Here is what I tried.

I have an integer variable, which I had to cast into a float64 to use the handy math package (https://golang.org/pkg/math).

However, it doesn't cast correctly when the integer variable is too big. I'm assuming it's because the size is bigger than float64. ex:

fmt.Printf("%f",float64(111111111111111110)) //Outputs 111111111111111104.000000

I'm trying to use math.Mod, math.Pow10, and math.Log10. How would I be able to do the following logic, but with a large number shown above?

int(math.Mod(float64(123) / math.Pow10(1),10))) // Gets the second digit

标签: go
2条回答
兄弟一词,经得起流年.
2楼-- · 2019-10-03 08:46

The question is not really clear to me, but I assume you want to perform operations on large integers and were only using float64 as a try.

In that case, the right tool is the math/big package. Here is how to use it to extract the nth decimal digit of an int64:

// first digit is n=0
func nthDigit(i int64, n int64) int64 {
    var quotient big.Int
    quotient.Exp(big.NewInt(10), big.NewInt(n), nil)

    bigI := big.NewInt(i)
    bigI.Div(bigI, &quotient)

    var result big.Int
    result.Mod(bigI, big.NewInt(10))

    return result.Int64()
}
查看更多
Emotional °昔
3楼-- · 2019-10-03 08:51

You can try to convert the int to string, and then fetch the digits in the converted string,

// n >= 1
func NthDigit(num int, n int) int {
    return int(strconv.Itoa(num)[n-1]) - int('0')
}
查看更多
登录 后发表回答