2011-11-05 12 views
48

Jak przekonwertować float64 na int w Go? Wiem, że pakiet strconv może być użyty do konwertowania czegokolwiek do lub z łańcucha znaków, ale nie między typami danych, w których jeden nie jest łańcuchem. Wiem, że mogę użyć fmt.Sprintf do konwersji czegokolwiek na ciąg, a następnie strconv go do potrzebnego mi typu danych, ale ta dodatkowa konwersja wydaje się nieco niezręczna - czy jest lepszy sposób na zrobienie tego?Konwersja float64 na int w Go

Odpowiedz

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

Nie wiedziałem, że to było takie proste - dzięki! –

+0

@ David Grayson, więc czy ta konwersja jest taka sama jak Math.Floor (x), czy też upuszcza .7 ze względu na sposób, w jaki float64 zapisuje go w pamięci? –

+1

@DavidLarsen Od specyfikacji Go: "Podczas przekształcania liczby zmiennoprzecinkowej na liczbę całkowitą, frakcja jest odrzucana (obcięcie w kierunku zera)". ([Przejdź do specyfikacji] (http://golang.org/ref/spec#Conversions)) – kvu787

0

Wystarczy odlewania do int obcina pływak, który jeśli systemie wewnętrznie reprezentowania 2.0 jako 1.9999999999, nie dostaniesz to, czego oczekują. Różne konwersje printf radzą sobie z tym i prawidłowo zaokrąglają liczbę podczas konwersji. Tak, aby uzyskać bardziej dokładne wartości, konwersja jest jeszcze bardziej skomplikowana, niż mogłoby się najpierw spodziewać:

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) 
     } 
    } 
} 

kod na Go Playground

4

Jeśli jej prosto z float64 do int, to powinno działać

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) 
} 

Wyjścia:

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

Oto kod na placu zabaw - https://play.golang.org/p/HmFfM6Grqh