2017-04-08 5 views
-2

Goのint64の大きな値に対して累乗や除算などの演算を実行する必要がありますが、オーバーフローに問題があります。私はそれらをfloat64に変換しようとしましたが、私は他の問題に遭遇します。ここで私が試したことがあります。Goで大きな整数を扱うには?

私は便利な数学パッケージ(https://golang.org/pkg/math)を使用するためにfloat64にキャストしなければならなかった整数変数を持っています。

ただし、整数変数が大きすぎると正しくキャストされません。サイズが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

:ここでのint64のn番目の小数点以下の桁を抽出するためにそれを使用する方法でありますなぜ浮動小数点数が不正確なのですか?(http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate) –

+0

OPは浮動について質問するつもりはないことが判明しました結局のところ、すべての点で、それはその質問の重複ではありません。 – Zoyd

答えて

3

質問は私には本当に明確ではないですが、私はあなたが大きな整数の操作を実行したいだけ試みとしてのfloat64使用していたと仮定します。

この場合、正しいツールはmath/big packageです。 、あなたが文字列にint型に変換しようとした後、変換された文字列の桁を取得することができます

// 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

質問の悪い言い訳を申し訳ありませんが、使用するために正しいパッケージで私を指してくれてありがとう!私はこのパッケージにログ機能がないことに気付きました。これは私も大きな整数で行うことができますか(例えばiの桁数を取得するなど)? – WCGPR0

+1

実際にはLogはありませんが、BitLenとlb(n)= BitLen(n)-1(lb = 2進対数)があります。そこから、Log(n)= lb(n)/ lb(10)。 – Zoyd

+0

質問を編集して、あなたが聞きたいと思ったことが反映されるようにしました。これにより、後からこの質問を簡単に検索することができます。もちろん、私の編集があなたが言うべきものではなかったと感じるならば、あなたはそれを編集することができます。 – Zoyd

2

可能
// n >= 1 
func NthDigit(num int, n int) int { 
    return int(strconv.Itoa(num)[n-1]) - int('0') 
} 
関連する問題