2011-11-05 13 views
48

floの64をGoのintに変換するにはどうすればよいですか? strconvパッケージは文字列との間の変換に使用できますが、文字列ではないデータ型間での変換はできません。私はfmt.Sprintfを使用して文字列に何かを変換し、次にstrconv必要なデータ型に変換できますが、この余分な変換はやや不器用なようです。これを行うにはより良い方法がありますか?単にint型にキャストするfloat64をGoのintに変換する

答えて

95
package main 
import "fmt" 
func main() { 
    var x float64 = 5.7 
    var y int = int(x) 
    fmt.Println(y) // outputs "5" 
} 
+1

それはわかりませんでした - ありがとう! –

+0

@David Graysonだから、この変換はMath.Floor(x)と同じですか?または浮動小数点64がメモリに保存する方法のために.7を落としますか? –

+1

@DavidLarsen Go仕様から: "浮動小数点数を整数に変換するとき、端数は破棄されます(ゼロに切り捨てられます)"。 ([Go spec](http://golang.org/ref/spec#Conversions)) – kvu787

0

は、あなたのシステムが内部的に1.9999999999として2.0を表している場合、あなたが期待するもの得ることはありませんフロートを、切り捨てます。さまざまなprintf変換がこれを処理し、変換時に適切に丸めます。

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    floats := []float64{1.9999, 2.0001, 2.0} 
    for _, f := range floats { 
     t := int(f) 
     s := fmt.Sprintf("%.0f", f) 
     if i, err := strconv.Atoi(s); err == nil { 
      fmt.Println(f, t, i) 
     } else { 
      fmt.Println(f, t, err) 
     } 
    } 
} 

コードをGo Playground

4

にその単にintへのfloat64から、これは

package main 

import (
    "fmt" 
) 

func main() { 
    nf := []float64{-1.9999, -2.0001, -2.0, 0, 1.9999, 2.0001, 2.0} 

    //round 
    fmt.Printf("Round : ") 
    for _, f := range nf { 
     fmt.Printf("%d ", round(f)) 
    } 
    fmt.Printf("\n") 

    //rounddown ie. math.floor 
    fmt.Printf("RoundD: ") 
    for _, f := range nf { 
     fmt.Printf("%d ", roundD(f)) 
    } 
    fmt.Printf("\n") 

    //roundup ie. math.ceil 
    fmt.Printf("RoundU: ") 
    for _, f := range nf { 
     fmt.Printf("%d ", roundU(f)) 
    } 
    fmt.Printf("\n") 

} 

func roundU(val float64) int { 
    if val > 0 { return int(val+1.0) } 
    return int(val) 
} 

func roundD(val float64) int { 
    if val < 0 { return int(val-1.0) } 
    return int(val) 
} 

func round(val float64) int { 
    if val < 0 { return int(val-0.5) } 
    return int(val+0.5) 
} 
を作業する必要がある場合:だから、より正確な値を取得するには、変換は、あなたが最初に想像するよりも、より複雑です

出力:

Round : -2 -2 -2 0 2 2 2 
RoundD: -2 -3 -3 0 1 2 2 
RoundU: -1 -2 -2 0 2 3 3 

ここ遊び場のコードだ - https://play.golang.org/p/HmFfM6Grqh