Convertir un float64 a un int en Go

Resuelto Chris Bunch asked hace 13 años • 5 respuestas

¿Cómo se convierte un float64 en un int en Go? Sé que el strconvpaquete se puede usar para convertir cualquier cosa hacia o desde una cadena, pero no entre tipos de datos donde uno no es una cadena. Sé que puedo usar fmt.Sprintfpara convertir cualquier cosa en una cadena y luego strconval tipo de datos que necesito, pero esta conversión adicional parece un poco torpe. ¿Existe una mejor manera de hacer esto?

Chris Bunch avatar Nov 06 '11 01:11 Chris Bunch
Aceptado
package main
import "fmt"
func main() {
  var x float64 = 5.7
  var y int = int(x)
  fmt.Println(y)  // outputs "5"
}
David Grayson avatar Nov 05 '2011 19:11 David Grayson

Simplemente convertir a un int trunca el flotante, lo que si su sistema representa internamente 2.0 como 1.9999999999, no obtendrá lo que espera. Las diversas conversiones de printf se ocupan de esto y redondean adecuadamente el número al realizar la conversión. Entonces, para obtener un valor más preciso, la conversión es incluso más complicada de lo que cabría esperar:

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

Código en Go Playground

David Dooling avatar Apr 08 '2016 16:04 David Dooling