2017-04-08 152 views
-2

我需要在Go中對Int64的大數值執行諸如指數和除法等操作,但是我遇到了溢出問題。我試圖將它們轉換爲float64,但後來遇到其他問題。這是我試過的。如何在Go中使用大整數?

我有一個整型變量,我不得不投入到float64使用方便的數學包(https://golang.org/pkg/math)。

但是,當整數變量太大時,它不能正確轉換。我假設這是因爲尺寸大於float64。例如:

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

我正在嘗試使用math.Mod,math.Pow10和math.Log10。我如何能夠做到以下邏輯,但是上面顯示了一個大數字?

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

可能[爲什麼浮點數不準確?](http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-incucurate) –

+0

原來,OP沒有打算詢問浮動畢竟,畢竟,它不是重複的問題。 – Zoyd

回答

3

的問題是不是真的我清楚,但我相信你想大整數執行的操作,並使用僅作爲float64一試。

在這種情況下,正確的工具是math/big package。以下是如何用它來提取的64位整數的第n個十進制數字:

// 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() 
} 
+0

對不起,這個問題的錯誤措詞,但感謝指出我在正確的包使用!我注意到這個軟件包沒有日誌功能,這也是我可以用大整數(例如獲取我的數字量)嗎? – WCGPR0

+1

確實沒有Log,但有BitLen和lb(n)= BitLen(n)-1(lb =二進制對數)。從那裏,Log(n)= lb(n)/ lb(10)。 – Zoyd

+0

我編輯了這個問題,以便它反映你想要問的問題。這會讓以後搜索這個問題變得更容易。當然如果你覺得我的編輯不是你想說的話,你仍然可以編輯它。 – Zoyd

2

你可以嘗試將INT轉換爲字符串,然後取數字轉換後的字符串,

// n >= 1 
func NthDigit(num int, n int) int { 
    return int(strconv.Itoa(num)[n-1]) - int('0') 
}