2011-11-05 92 views
48

在Go中,如何將float64轉換爲int?我知道strconv包可用於將任何內容轉換爲字符串或從字符串中轉換,但不能在數據類型之間轉換,因爲數據類型不是字符串。我知道我可以使用fmt.Sprintf將任何東西轉換爲字符串,然後strconv它到我需要的數據類型,但這種額外的轉換看起來有點笨拙 - 有沒有更好的方法來做到這一點?在Go中將float64轉換爲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)是一樣的嗎,還是因爲float64將它保存在內存中而導致.7丟失? –

+1

@DavidLarsen在Go規範中:「當將浮點數轉換爲整數時,分數被捨棄(截斷爲零)」。 ([Go spec](http://golang.org/ref/spec#Conversions)) – kvu787

0

簡單地鑄造爲int截斷浮動,而如果你的系統在內部表示2.0爲1.9999999999,你不會得到你所期望的。各種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

如果單純從float64爲int,這應該工作

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