go

Convierta un float64 a un int en Go



(3)

¿Cómo se convierte un float64 en int en Go? Sé que el paquete strconv se puede usar para convertir cualquier cosa en una cadena, pero no entre tipos de datos donde una no es una cadena. Sé que puedo usar fmt.Sprintf para convertir cualquier cosa en una cadena, y luego strconv el tipo de datos que necesito, pero esta conversión extra parece un poco torpe. ¿Hay alguna forma mejor de hacerlo?


Si es simplemente de float64 a int, esto debería funcionar

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

Productos:

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

Aquí está el código en el patio de recreo: https://play.golang.org/p/HmFfM6Grqh


Simplemente transfiriendo a un int trunca el float, que si su sistema representa internamente 2.0 como 1.9999999999, no obtendrá lo que espera. Las distintas conversiones de printf se ocupan de esto y redondean adecuadamente el número al convertir. Entonces, para obtener un valor más preciso, la conversión es aún más complicada de lo que podrí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) } } }

Code on Go Playground


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