2017-11-29 48 views
0

bigを浮動小数点に変換します。下のコードを書きますが、uint64でオーバーフローします。bigを中立させる正しい方法は何ですか?big.lntに浮かべてください。golang big.Floatをbig.Intに変換します。

package main 

import "fmt" 
import "math/big" 

func FloatToBigInt(val float64) *big.Int { 
    bigval := new(big.Float) 
    bigval.SetFloat64(val) 

    coin := new(big.Float) 
    coin.SetInt(big.NewInt(1000000000000000000)) 
    bigval.Mul(bigval, coin) 

    result := new(big.Int) 
    f,_ := bigval.Uint64() 
    result.SetUint64(f) 

    return result 
} 

func main() { 
    fmt.Println("vim-go") 
    fmt.Println(FloatToBigInt(float64(10))) 
    fmt.Println(FloatToBigInt(float64(20))) 
    fmt.Println(FloatToBigInt(float64(30))) 
    fmt.Println(FloatToBigInt(float64(40))) 
    fmt.Println(FloatToBigInt(float64(50))) 
    fmt.Println(FloatToBigInt(float64(100))) 
    fmt.Println(FloatToBigInt(float64(1000))) 
    fmt.Println(FloatToBigInt(float64(10000))) 
} 

答えて

2

uint64が固定サイズを持っているようuint64が常にオーバーフローが発生しますよりも、大きな大きなint型。あなたは*Float上で、次のmethodを使用する必要がありますでしょう必要

func (*Float) Int 

変更:

func FloatToBigInt(val float64) *big.Int { 
    bigval := new(big.Float) 
    bigval.SetFloat64(val) 
    // Set precision if required. 
    // bigval.SetPrec(64) 

    coin := new(big.Float) 
    coin.SetInt(big.NewInt(1000000000000000000)) 

    bigval.Mul(bigval, coin) 

    result := new(big.Int) 
    bigval.Int(result) // store converted number in result 

    return result 
} 

の作業例:https://play.golang.org/p/sEhH6iPkrK

+0

感謝。しかし、この例ではhttps://play.golang.org/p/P02AN1e09Cが表示されていますが、それにも問題があります。 – goask

+0

'bigval'のデフォルト精度は53ビットです。正確な結果を得るには、この値を増やす必要があります:https://play.golang.org/p/Xy88JX57JE。 プログラムに必要なビット数を決定するには、浮動小数点精度のドキュメントを読む必要があります。 – abhink

+0

私は知られています。 – goask

関連する問題