2011-11-05 20 views
48

Come si converte un float64 in un int in Go? So che il pacchetto strconv può essere utilizzato per convertire qualsiasi cosa da o verso una stringa, ma non tra tipi di dati in cui uno non è una stringa. So che posso usare fmt.Sprintf per convertire qualsiasi cosa in una stringa, e quindi strconv per il tipo di dati di cui ho bisogno, ma questa conversione extra sembra un po 'maldestra - c'è un modo migliore per farlo?Convertire un float64 in un int in Go

risposta

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

Non sapevo che era così semplice - grazie! –

+0

@David Grayson, Quindi questa conversione è la stessa di Math.Floor (x) o fa cadere il .7 a causa del modo in cui il float64 lo salva in memoria? –

+1

@DavidLarsen Dalla specifica Go: "Quando si converte un numero in virgola mobile in un numero intero, la frazione viene scartata (troncamento verso zero)". ([Vai a specifica] (http://golang.org/ref/spec#Conversions)) – kvu787

0

semplicemente gettando ad un int tronca il galleggiante, che se il sistema rappresentano internamente 2.0 come 1,9999,999999 millions, non si otterrà ciò che vi aspettate. Le varie conversioni di printf si occupano di questo e arrotondano correttamente il numero durante la conversione. Quindi, per ottenere un valore più accurato, la conversione è ancora più complicato di quanto si potrebbe prima aspettare:

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

Codice in Go Playground

4

Se il suo semplicemente dal float64 a int, questo dovrebbe funzionare

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

Uscite:

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

Ecco il codice nel parco giochi - 012.336.

Problemi correlati