Convertir un float64 en int dans Go

Comment peut-on convertir un float64 en int dans Go? Je sais que le paquetage strconv peut être utilisé pour convertir n’importe quoi en chaîne ou à partir d’une chaîne, mais pas entre les types de données où l’on n’est pas une chaîne. Je sais que je peux utiliser fmt.Sprintf pour convertir n’importe quoi en chaîne, puis le strconv au type de données dont j’ai besoin, mais cette conversion supplémentaire me semble un peu maladroite – y a-t-il un meilleur moyen de le faire?

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

Si c’est simplement de float64 à int, cela devrait fonctionner

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

Les sorties:

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

Voici le code dans la cour de récréation - https://play.golang.org/p/HmFfM6Grqh

Le simple fait de passer à un int tronque le flottant, qui, si votre système représente en interne 2.0 comme 1.9999999999, vous n’obtiendrez pas ce que vous attendez. Les différentes conversions printf traitent de ceci et arrondissent correctement le nombre lors de la conversion. Donc, pour obtenir une valeur plus précise, la conversion est encore plus compliquée que ce à quoi vous pourriez vous attendre:

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

Code on Go Playground